实验二
一. 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]内的整数) 键值(S或E) 发生时间(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;
}