钱伟长学院机测试题一

1、计算两个整数的和

【描述】

给定两个整数,计算它们的和。

【输入】

输入数据有若干行。每行上有两个整数,对应一种情形。

【输出】

对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出算式和结果。

【样例输入】

98 72
-40 88
-62 -95

【样例输出】

Case 1: 98 + 72 = 170
Case 2: -40 + 88 = 48
Case 3: -62 - 95 = -157

【参考实现】

#include <iostream>
using namespace std;

int main() {
    int a,b;
    int i=1;
    while (cin>>a>>b){
        if(b>=0){
            cout<<"Case "<<i<<": "<<a<<" + "<<b<<" = "<<a+b<<endl;
        } else {
            cout<<"Case "<<i<<": "<<a<<" - "<<-b<<" = "<<a+b<<endl;
        }
        i++;
    }
    return 0;
}

2、阶乘尾部0的个数

【描述】

给定一个正整数n,计算n!尾部0的个数。

【输入】

输入数据有若干行。每行上有一个正整数n,对应一种情形。

【输出】

对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出n的值,逗号,结果,换行。

【样例输入】

8
16
30

【样例输出】

Case 1: 8, 1
Case 2: 16, 3
Case 3: 30, 7

【参考实现】

#include <iostream>
using namespace std;

int main() {
    int n;
    int i=1;
    while(cin>>n){
        int sum=0;
        int temp=n;
        while (n){
            n/=5;
            sum+=n;
        }
            cout<<"Case "<<i<<": "<<temp<<", "<<sum<<endl;
        i++;
    }
    return 0;
}

3、判断算式的正确性

【描述】

给定一个算式,该算式中只含一个四则运算符号,操作数及结果均为整数。要求判断该算式的正确性(规定:除法必须除尽才可能正确)。

【输入】

输入数据有若干行。每行上有一个算式,对应一种情形。

【输出】

对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出结果(Yes或No),换行。

【样例输入】

1 + 2 = -3
5 / 2 = 2
4 / 2 = 2

【样例输出】

Case 1: No
Case 2: No
Case 3: Yes

【参考实现】

#include <iostream>
using namespace std;

int main(){
    int a,b,c;
    char operator_,equals;
    int i=1;
    while(cin>>a>>operator_>>b>>equals>>c){
        cout<<"Case "<<i<<": ";
        if(operator_=='+' && c==a+b){
            cout<<"Yes"<<endl;
        } else if (operator_=='-' && c==a-b){
                cout<<"Yes"<<endl;
            } else if (operator_=='*' && c==a*b){
            cout<<"Yes"<<endl;
                } else if (operator_=='/' && b!=0 && c==a/b && a%b==0){
                    cout<<"Yes"<<endl;
                } else {
                    cout<<"No"<<endl;
        }
        i++;
    }
}

4、求给定的n个实数中的最大值

【描述】

给定正整数n及n个实数,找出其中的最大值。

【输入】

输入数据有若干行。每行上第一个数为正整数n,紧接其后有n个实数,对应一种情形,数据之间用空格分隔。

【输出】

对于每一种情形,先输出“Case #: ”(#为序号,从1起,冒号后输出一个空格),然后输出计算结果(保留1位小数),最后换行。

【样例输入】

3 1.0 3.0 2.0
5 10.0 8.5 15.3 7.8 5.8
1 3.3

【样例输出】

Case 1: 3.0
Case 2: 15.3
Case 3: 3.3

【参考实现】

#include <iostream>
using namespace std;

int main() {
    int i=1;
    int n;
    while (cin>>n){
        double temp,max=-1000000;
        for (int i=0; i<n; ++i){
            cin>>temp;
            if (temp>max)
                max=temp;
        }
        printf("Case %d: %.1f\n",i,max);
        i++;
    }
    return 0;
}

5、计算若干个整数的和

【描述】

对于给定的若干个整数,要求计算它们的项数及和。

【输入】

输入数据有多行。每一行有若干个整数(个数不超过1024. C++程序不受此限制),希望计算它们的项数及总和。

【输出】

对于每一行中的数据,要求先输出“Case #: ”(#为序号从1起,冒号后输出一个空格),然后输出该行上数据的个数、逗号、空格、总和、换行。

【样例输入】

15 3 42 89
51 201 303 9 755 800

【样例输出】

Case 1: 4, 149
Case 2: 6, 2119

【参考实现】

#include <iostream>
#include <sstream>
using namespace std;

int main() {
    string str;
    int count = 1;
    double a[1025];
    while (getline(cin, str)) {
        cout << "Case " << count << ": ";
        stringstream strin(str);
        int i = 0;
        int sum=0;
        while (strin >> a[i]) {
            sum+=a[i];
            i++;
        }
        cout<<i<<", "<<sum<<endl;
        count++;
    }
    return 0;
}

6、态度决定一切

【描述】

将英文26个字母A~Z,或a~z对应到整数1~26,则态度 Attitude 对应的数字之和为100。编程计算给定的字符串对应的数字之和(规定非英文字母的字符均对应0)。

【输入】

输入数据的第一行为一个整数n,其后共有n行字符串(字符串的长度不超过1000)分别表示n种情形。

【输出】

对于每一种情况,要求先输出“Case #: ”(#为序号,从1起,冒号后输出一个空格),然后输出原字符串、空格、等号、空格、结果、换行。

【样例输入】

3
attitude
Hard Work
knowledge

【样例输出】

Case 1: attitude = 100
Case 2: Hard Work = 98
Case 3: knowledge = 96

【参考实现】

#include <iostream>
using namespace std;

int main() {
    int n;
    cin>>n;
    cin.get();
    for (int i=0; i<n; ++i){
        string str;
        getline(cin,str);
        int sum=0;
        for(int j=0; j<str.length(); ++j){
            if(str[j]>='a' && str[j]<='z')
                sum += str[j] - 'a' + 1;
            else if(str[j]>='A' && str[j]<='Z')
                sum += str[j]  - 'A' + 1;
        }
        cout<<"Case "<<i+1<<": "<<str<<" = "<<sum<<endl;
    }
    return 0;
}

7、验证3n+1问题

【描述】

对于给定的一个正整数,若该数为偶数则将其除以2,若为奇数则将其乘3再加1。反复进行上述过程,直到结果为1时停止。这就是著名的“3n+1”问题。要求对于给定的整数,求按3n+1规则变换到1所需要的数字变换次数。

【输入】

输入数据有多个,各分别对应一种情形。

【输出】

对于每一个整数,要求先输出“Case #: ”(#为序号),然后输出读入的整数、逗号、空格、计算结果。若输入的数据为非正整数,结果为-1。

【样例输入】

1024 1023 0 100 66

【样例输出】

Case 1: 1024, 10
Case 2: 1023, 62
Case 3: 0, -1
Case 4: 100, 25
Case 5: 66, 27

【参考实现】

#include <iostream>
using namespace std;

int main() {
    int n;
    int i=1;
    while (cin>>n){
        if (n>0){
            int temp=n;
            int count=0;
            while (n!=1){
                if (n%2==0)
                    n/=2;
                else
                    n=3*n+1;
                count++;
            }
            cout<<"Case "<<i<<": "<<temp<<", "<<count<<endl;
        } else {
            cout<<"Case "<<i<<": "<<n<<", -1"<<endl;
        }
        i++;
    }

    return 0;

}

8、判断同构数

【描述】

给定一个十进制正整数,判断其是否为同构数。所谓同构数是这样的一些数,它出现在其平方数的右边,例如5是出现在5²=25右边的数,25是出现在25²=625右边的数,所以5和25都是同构数。

【输入】
输入数据有若干行。每行上有一个正整数,对应一种情形。

【输出】

对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出n,逗号及空格,n的平方,逗号及空格,结果(Yes或No),换行。

【样例输入】

5
15
25

【样例输出】

Case 1: 5, 25, Yes
Case 2: 15, 225, No
Case 3: 25, 626, Yes

【参考实现】

#include <iostream>
using namespace std;

int main() {
    int n;
    int i=1;
    while (cin>>n){
        int temp=n;
        int bit=1;
        while (n>0){
            bit*=10;
            n/=10;
        }
        if (temp*temp%bit==temp){
            cout<<"Case "<<i<<": "<<temp<<", "<<temp*temp<<", Yes"<<endl;
        } else {
            cout<<"Case "<<i<<": "<<temp<<", "<<temp*temp<<", No"<<endl;
        }
        i++;
    }
    return 0;
}

9、兑换钱币

【描述】

对于给定的人民币金额n(分),问有多少种方案将其兑换成1分、2分、5分。

【输入】

输入数据有若干行。每行上有一个正整数表示以分为单位的人民币金额n,对应一种情形。

【输出】

对于每一种情形,先输出“Case #:”(#为序号,从1起),然后输出n,逗号,结果,换行。

【样例输入】

10
100
150

【样例输出】

Case 1: 10, 10
Case 2: 100, 541
Case 3: 150, 1186

【参考实现】

#include <iostream>
using namespace std;

int main() {
    int n;
    int i=1;
    while (cin>>n){
        int solutions=0;
        for (int f5=0; f5<=n/5; ++f5){
            for (int f2=0; f2<=n-5*f5; ++f2) {
                int f1=abs(n-5*f5-2*f2);
                    if (f5 * 5 + f2 * 2 + f1 == n) {
                        solutions++;
                    }
            }
        }
        cout<<"Case "<<i<<": "<<n<<", "<<solutions<<endl;
        i++;
    }
    return 0;
}

10、排名次

【描述】

给定一系列分数(浮点型数据),根据分数排名次。

【输入】

输入数据有若干行,每一行有一系列(个数不超过1000)双精度浮点型数据对应一种情形。

【输出】

对于每一种情形,先输出“Case #:”(#为序号,从1起),然后换行输出对应分数的名次,名次之间用逗号及空格分隔,换行。

【样例输入】

9.2 8.5 9.2 9.9 8.7
60 75 83 75 89 88 75 68 89 90
95.5 96 99

【样例输出】

Case 1:
2, 5, 2, 1, 4
Case 2:
10, 6, 5, 6, 2, 4, 6, 9, 2, 1
Case 3:
3, 2, 1

【参考实现1(基于类和对象,以时间换空间,刘孟骁)】

#include <iostream>
#include <sstream>
using namespace std;

class student{
public:
    double grade;
    int orgRank;
    int newRank;
};

static int grade_cmp(const void *stu1,const void * stu2){
    student *st1=(student *)stu1;
    student *st2=(student *)stu2;
    return st2->grade>st1->grade?1:-1;
}

static int orgrank_cmp(const void *stu1,const void * stu2){
    student *st1=(student *)stu1;
    student *st2=(student *)stu2;
    return st1->orgRank>st2->orgRank?1:-1;
}

int main() {
    int count=1, i;
    string tmp;
    while (i = 0, getline(cin, tmp)) {
        student stu[1000];
        stringstream ss(tmp);
        while (ss >> stu[i].grade) stu[i].orgRank = i, i++;
        qsort(stu,i,sizeof(stu[0]),grade_cmp);
        for (int j=0; j<i; ++j){
            if(stu[j].grade==stu[j-1].grade){
                stu[j].newRank=stu[j-1].newRank;
            } else {
                stu[j].newRank=j;
            }
        }

        qsort(stu,i,sizeof(stu[0]),orgrank_cmp);

        cout<<"Case "<<count<<":"<<endl;
        for (int j=0; j<i-1; ++j){
            cout<<stu[j].newRank+1<<", ";
        }
        cout<<stu[i-1].newRank+1<<endl;
        count++;

    }
    return 0;
}

【参考实现2(推荐,基于数组,以空间换时间,水清源)】

#include <algorithm>
#include <iostream>
#include <sstream>
using namespace std;
int main() {
    string tmp;
    int cas = 1;
    double a[1007], b[1007];
    while (getline(cin, tmp)) {
        cout << "Case " << cas++ << ":" << endl;
        stringstream ss(tmp);
        int cnt = 0;
        while (ss >> a[cnt]) cnt++;
        for (int i = 0; i < cnt; i++) b[i] = a[i];
        sort(b, b + cnt, greater<double>());
        for (int i = 0; i < cnt; i++)
            printf("%d%s", lower_bound(b, b + cnt, a[i], greater<double>()) - b + 1, i == cnt - 1 ? "\n" : ", ");
    }
    return 0;
}
分享