上机实验:循环程序设计
X数
任务描述
编写一个程序,读入两个正整数a和b,并且a<=b, 计算并输出闭区间[a,b]中的X数。X数为各个数位上数字的立方和等于其自身的数字,例如:
153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3 // 153 is a X-number.
12 is not equal to 1 * 1 * 1 + 2 * 2 * 2 // 12 is not a X-number.
如果没有找到X数,输出提示信息no
保证 $1\leq a\leq b\leq 2^{31}-1$。
编程要求
根据提示,在右侧编辑器补充代码,计算并输出[a,b]中的X数(以空格分隔),或者输出no
测试说明
平台会对你编写的代码进行测试:
测试输入:1 10
预期输出:1
测试输入:1 200
预期输出:1 153
参考代码
#include <iostream>
using namespace std;
int main(void) {
int a,b; cin >> a >> b;
bool not_start = true;
for (int i=a;i<=b && i<=1000;i++) {
int s=0;
for (int j=i;j;j/=10) s += (j%10)*(j%10)*(j%10);
if (s == i) {
if (!not_start) cout << ' ';
cout << i;
not_start = false;
}
}
if (not_start) cout << "no";
cout << endl;
return 0;
}
计算阶乘
任务描述
本关任务:编写一个能计算输入正整数的阶乘的小程序。 保证输入不大于20(注意使用long long)。
测试说明
平台会对你编写的代码进行测试:
测试输入:4
预期输出:24
测试输入:5
预期输出:120
参考代码
#include <iostream>
using namespace std;
int main(){
int n; cin >> n;
long long ans = 1;
for (int i=1;i<=n;i++) ans = ans * i;
cout << ans << endl;
return 0;
}
数位和
任务描述
本关任务:定义 f(n) 为 n 在十进制下的数位和。例如 f(123)=1+2+3=6, f(2048)=2+0+4+8=14。
定义 f1(n) = f(n),f2(n)=f(f1(n)),fk(n) = f(fk-1(n)) (k>=2)。给定 n,求 f10(n)。
测试说明
输入描述:一个正整数 n(1<=n<=$10^9$)。 输出描述:输出 f10(n)。
样例输入:123456789
样例输出:9
参考代码
#include <iostream>
using namespace std;
int main(void) {
/** begin **/
int n; cin >> n;
int ans = 0;
for (;n;n/=10) ans = (ans + n%10)%9;
if (ans==0) ans = 9;
cout << ans << endl;
/** end **/
return 0;
}
最小公倍数
任务描述
本关任务:编写一个能计算两个正整数的最小公倍数的小程序。 保证输入的两个数都不超过100。
测试说明
平台会对你编写的代码进行测试:
测试输入:4 91
预期输出:364
测试输入:12 22
预期输出:132
参考代码
#include <iostream>
using namespace std;
int main(void) {
int a,b,ans=0;
cin >> a >> b;
for (int i=1;i<=a*b;i++) {
if (i%a==0 && i%b==0) {
ans=i;
break;
}
}
cout << ans << endl;
return 0;
}
打鱼还是晒网
任务描述
本关任务:判断某人是在打鱼,还是在晒网。 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。 注意要区分闰年和不是闰年的两种情况。
编程要求
每组输入只有一行,有三个整数,分别对应年,月,日。它们组合起来是一个有效的日期,且不早于1990年。 请你补充代码,判断某人在这个日子是在打鱼还是在晒网。 如果是在打鱼,则输出Fishing,否则输出Sleeping。 具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
- 测试输入:
1991 10 25 - 预期输出:
Fishing
参考代码一
#include <iostream>
#include <iomanip>
using namespace std;
int main(void) {
int y=1990, m=1, d=1;
int yy, mm, dd;
cin >> yy >> mm >> dd;
// start from 1990-1-1
// loop until yy-mm-dd
// i denotes the number of days pass
for (int i=0;;i++) {
if (y == yy && m == mm && d == dd) {
if (i % 5 < 3) cout << "Fishing\n";
else cout << "Sleeping\n";
break;
}
d++;
if (((m==1||m==3||m==5||m==7||m==8||m==10||m==12) && d>31)
|| ((m==4||m==6||m==9||m==11) && d>30)
|| (m==2 && d>28+((y%4==0&&y%100!=0)||(y%400==0))))
m++, d=1;
if (m > 12) y++, m=1;
}
return 0;
}
参考代码二
#include <iostream>
using namespace std;
int main(void) {
int y, m, d;
cin >> y >> m >> d;
int num_day = 0;
// count days from 1990-01-01 to (y-1)-12-31
for (int i=1990;i<y;i++) {
num_day += 365 + ((i%4==0 && i%100!=0) || i%400==0);
}
// count days from (y)-01-01 to (y)-(m-1)-(final day of month m-1)
for (int i=1;i<m;i++) {
if (i == 2) num_day += 28 + ((y%4==0 && y%100!=0) || y%400==0);
else num_day += 30 + (i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12);
}
// count days from (y)-(m)-01 to (y)-(m)-(d)
num_day += d;
if ((num_day-1) % 5 < 3) cout << "Fishing\n";
else cout << "Sleeping\n";
return 0;
}
参考代码三
#include <iostream>
using namespace std;
int main(void) {
int y, m, d;
cin >> y >> m >> d;
int num_day = (y-1990) * 365;
num_day += ((y-1)/4 - (y-1)/100 + (y-1)/400)
- (1989/4 - 1989/100 + 1989/400);
num_day += (m-1)*30 + (1<m) + (((y%4==0 && y%100!=0) || y%400==0)-2)*(2<m)
+ (3<m) + (5<m) + (7<m) + (8<m) + (10<m);
num_day += d-1;
if (num_day % 5 < 3) cout << "Fishing\n";
else cout << "Sleeping\n";
return 0;
}