实验二

一. 7-1 奇偶分家

给定N个正整数,请统计奇数和偶数各有多少个?

输入格式:

输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。

输出格式:

在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。

输入样例:

9
88 74 101 26 15 0 34 22 77

输出样例:

3 6

参考答案:

#include<iostream>
using namespace std;
int main(){
    int n;
    int odd = 0; //奇数
    int even = 0; //偶数
    cin>>n;
    for(int i=0;i<n;i++){
        int num;
        cin>>num;
        if(num%2==0){
            even++;
        }
        else{
            odd++;
        }
    }
    cout<<odd<<" "<<even;
    return 0;
}

二. 7-1 水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407

参考答案:

#include<iostream>
#include<cmath>
using namespace std;
bool isValid(int num,int N){
    int sum = 0;
    int tmp = num;
    while(tmp!=0){
        int left = tmp%10;
        sum+=pow(left,N);
        tmp/=10;
    }
    return sum == num;
}
int main(){
   int N;
    cin>>N;
    for(int i=pow(10,N-1);i<pow(10,N);i++){
        if(isValid(i,N)){
            cout<<i<<endl;
        }
    }
    return 0;
}

三. 7-2 猜数字游戏

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:

输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:

在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:

58 4
70
50
56
58
60
-2

输出样例:

Too big
Too small
Too small
Good Guess!

参考答案:

#include<iostream>
using namespace std;
int main(){
   int target,N;
   cin>>target>>N;
    int num;
    cin>>num;
    int cnt = 1;
    while(num>=0){
        if(cnt>N){
            cout<<"Game Over";
            return 0;
        }
        if(num==target){
             if(cnt == 1){
                 cout<<"Bingo!";
                 return 0;
             }
            else if(cnt<=3){
                cout<<"Lucky You!";
                return 0;
            }
            else if(cnt<=N){
                cout<<"Good Guess!";
                return 0;
            }
        }
        else if(num>target){
            cout<<"Too big"<<endl;
            cnt++;
        }else {
            cout<<"Too small"<<endl;
            cnt++;
        }
        cin>>num;
    }
    cout<<"Game Over";
    return 0;
}

四. 7-4 阶梯电价

为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。

输入格式:

输入在一行中给出某用户的月用电量(单位:千瓦时)。

输出格式:

在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。

输入样例1:

10

输出样例1:

cost = 5.30

输入样例2:

100

输出样例2:

cost = 55.50

参考答案:

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
    int elec;
    cin>>elec;
    double cost = 0;
    if(elec<0){
        cout<<"Invalid Value!";
        return 0;
    }
    if(elec<=50){
        cost+=elec*0.53;
    }
    else{
        cost+=0.53*50;
        cost+=(elec-50)*0.58;
    }
    cout<<fixed<<setprecision(2)<<"cost = "<<cost;
    return 0;
}

五. 7-5 阅览室

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

输入格式:

输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:

书号([1, 1000]内的整数) 键值SE发生时间hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)

每一天的纪录保证按时间递增的顺序给出。

输出格式:

对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。

输入样例:

3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00

输出样例:

2 196
0 0
1 60

参考答案:

#include<iostream>
#include<cmath>
using namespace std;
int parseTime(string time){
     int res = 0;
    int tmp = 0;
     for(char c:time){
         if(c==':'){
             res = tmp*60;
             tmp = 0;
         }
         else{
             tmp = tmp*10+c-'0';
         }
     }
    return res+tmp;
}
void clear(int arr[1001][2]){
    for(int i=0;i<1001;i++){
        for(int j=0;j<2;j++){
            arr[i][j] = 0;
        }
    }
}
int main(){
    int N;
    cin>>N;
    int days = 1;
    int homeNum;
    char op;
    string time;
    int chs[1001][2];
    // 清空数组
    clear(chs);
    int cnt = 0;
    int totalM = 0;
    while(days<=N){
         cin>>homeNum>>op>>time;
         // 当前输入转换后的分钟数;
         int curM = parseTime(time);
        // cout<<"curM = "<<curM<<endl;
        // 设S为1,E为2
         if(op=='S'){
             chs[homeNum][0]=1;
             chs[homeNum][1] = curM;
         }
        else{

            if(chs[homeNum][0]==1){
                 cnt++;
                 totalM += curM - chs[homeNum][1];
                 chs[homeNum][0]=0;
                 chs[homeNum][1]=0;
             }
        }
        // 结束一天的标志,开始统计并输出结果;
        if(homeNum == 0){
            days++;
            cout<<cnt<<" "<<(cnt==0?0:round(totalM*1.0/cnt))<<endl;
            // 清除数据
            cnt = 0;
            totalM = 0;
            clear(chs);
        }
    }
    return 0;
}
最后修改:2025 年 11 月 14 日
如果觉得我的文章对你有用,请随意赞赏