课后作业:循环程序设计
今天星期几
任务描述
本关任务:已经知道2000年1月1日是星期六。设计一个循环,输入一个新的日期,计算星期几。
编程要求
根据提示,在右侧编辑器补充代码,计算给定的日期是星期几(星期1~星期7)。
测试说明
平台会对你编写的代码进行测试:
测试输入:2020 9 28;
预期输出:星期1
参考代码
#include <iostream>
using namespace std;
int main(void) {
int y = 2000, m = 1, d = 1, w = 6, yy, mm, dd;
cin >> yy >> mm >> dd;
for (;;) {
if (y==yy && m==mm && d==dd) {
cout << "星期" << w << endl;
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;
w++;
if (w == 8) w = 1;
}
return 0;
}
求a+aa+aaa+….+aa…aa(n个a)之和
任务描述
输入两个正整数a和n,求a+aa+aaa+….+aa…aa(n个a)之和。
测试说明
输入描述:两个正整数 a 和 n,(1<=a<=9, 1<=n<=8),用空格分隔。 输出描述:输出答案。
样例输入: 2 5 样例输出: 24690
参考代码
#include<iostream>
using namespace std;
int main()
{
int a, n;
cin >> a >> n;
int ans = 0;
for (int i=1;i<=n;i++) {
int tmp = 0;
for (int j=0;j<i;j++) tmp = tmp * 10 + a;
ans += tmp;
}
cout << ans << endl;
return 0;
}
求斐波那契数列的第n项
任务描述
利用循环结构求解斐波那契数列的第 n 项。
斐波那契数列满足 fib[0]=0, fib[1]=1, fib[n]=fib[n-1]+fib[n-2]。
测试说明
输入描述:一个正整数n(1<=n<=80)。 输出描述:输出fib[n]。
样例输入:1 样例输出:1
参考答案
#include<iostream>
using namespace std;
int main()
{
int n; cin >> n;
long long a = 1, b = 0;
for (int i=2;i<=n;i++) {
long long c = a + b;
b = a;
a = c;
}
cout << a << endl;
return 0;
}
改错题
任务描述
本关任务:计算下列式子的和,当最后一项的值小于 $10^{-6}$ 时结束。
$e=1+\frac1{1!}+\frac1{2!}+\frac1{3!}+⋯+\frac1{n!}$ 以下代码是有错的源程序,请进行改正。 代码清单:
#include<iostream>
#include<iomanip>
using namespace
std;
const double EPS = 1E-6;
int main() {
int i, n, item;
double e;
e = 1;
n = 1;
item = 1;
do {
for (i = 1; i <= n; i++)
item *= i;
e += 1 / item;
n++;
} while (item >= EPS);
cout <<”e =”<<fixed << setprecision(6) << e << endl;
return 0;
}
测试说明
输入描述:无。 输出描述:输出程序运行结果。
参考答案
#include<iostream>
#include<iomanip>
using namespace std;
const double EPS = 1E-6;
int main() {
int i, n, item;
double e;
e = 1;
n = 1;
item = 1;
do {
item = 1;
for (i = 1; i <= n; i++)
item *= i;
e += 1.0 / item;
n++;
} while (item >= EPS);
cout <<fixed << setprecision(6) << e << endl;
return 0;
}
求能带走的物品最大总价值
任务描述
假设有 n 件物品,物品 i 价值 i 美元,重量为 1 磅,小明的背包最多只能携带 W 磅重量,但他想买尽可能多地贵重物品。求他能带走的物品最大总价值。
测试说明
输入描述:第一行两个正整数n,W(n<=100, W<=100)。
输出描述:输出最大总价值。
样例输入:3 2
样例输出:5
参考代码
#include<iostream>
using namespace std;
int main()
{
int n, W;
cin >> n >> W;
int ans = 0;
for (int i=0;i<W && i<n;i++)
ans += n-i;
cout << ans << endl;
return 0;
}
实现欧几里得算法计算最大公约数
任务描述
两个整数 n,m 的最大公约数是能整除 n,m 的最大的整数,记为 gcd(n,m)。欧几里得算法给出了求最大公约数的一种快速的方法,它可以简单描述为 $gcd(n,m) = gcd(m,n%m)$ $gcd(n,0) = n$ 请基于此实现欧几里得算法。
测试说明
输入描述:两个正整数n,m (1<=n,m<=10^9),中间用空格分隔。
输出描述:输出它们的最大公约数。
样例输入1:21 15
样例输出1:3
样例输入2:5 7
样例输出2:1
参考代码
#include<iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
while (m) {
int tmp = n%m;
n = m;
m = tmp;
}
cout << n << endl;
return 0;
}
求x+rev(x)=n的正整数解的个数
任务描述
x为正整数,定义rev(x)是x在十进制下翻转得到的数(x无前导零),如rev(53)=35,rev(1200)=21。给定正整数n,求x+rev(x)=n的正整数解的个数。
测试说明
输入描述:一个正整数n(1<=n<=100000)。
输出描述:输出答案。
样例输入:1221
样例输出:3
样例解释:三个解为x=1020,1110,1200
参考代码
#include<iostream>
using namespace std;
int main()
{
int n; cin >> n;
int ans = 0;
for (int i=1;i<=n;i++) {
int rev = 0;
for (int _i=i;_i;_i/=10) rev = rev*10+_i%10;
if (rev + i == n) ans++;
}
cout << ans << endl;
return 0;
}