NOI

习题2.5.1

习题2-1 水仙花数(daffodil) 输出100~999中的所有水仙花数。若3位数ABC满足ABC = A^3 + B^3 + C^3,则称其为水仙花数。例如 153 = 1^3 + 5^3 + 3^3,所以153是水仙花数。 c: #include <stdio.h> #include <math.h> int main() { int b, s, g; for (int i = 100; i < 1000; ++i) { b = i / 100; s = (i / 10) % 10; g = i % 10; if (i == (pow(b, 3) + pow(s, 3) + pow(g, 3))) { printf("%d\n", i); } } return 0; } 习题2-2 韩信点兵(hanxin) 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3, b<5, c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件结束为止。 样例输入: 2 1 6 2 1 3 样例输出: Case 1:41 Case 2:No answer c: #include <stdio.h> int main() { FILE *fin = NULL, *fout = NULL; fin = fopen("data.in", "rb"); fout = fopen("data.out", "wb"); int sum, a, b, c, min, idx = 1; while (fscanf(fin, "%d%d%d", &a, &b, &c) == 3) { /* * sum = 3 * x1 + a; * sum = 5 * x2 + b; * sum = 7 * x3 + c; */ min = -1; if (a < 3 && b < 5 && c < 7) { for (sum = 10; sum <= 100; ++sum) { if ((sum - a) % 3 == 0 && (sum - b) % 5 == 0 && (sum - c) % 7 == 0) { min = sum; break; } } } else { fprintf(fout, "Case %d: No answer\n", idx++); continue; } if (min > 0) { fprintf(fout, "Case %d: %d\n", idx++, min); continue; } else { fprintf(fout, "Case %d: No answer\n", idx++); continue; } } fclose(fin); fclose(fout); return 0; }

习题1.5.3

习题1-1 平均数(average) 输入3个整数,输出它们的平均值,保留3位小数。 c: #include <stdio.h> int main() { int a, b, c; scanf("%d%d%d", &a, &b, &c); double average = (double)(a + b + c) / 3; printf("%.3f\n", average); return 0; } python: # -*- coding: utf-8 -*- li = [int(i) for i in input().split()] f = 0 for i in li: f = f + i print('%.3f' % (f/len(li))) 习题1-2 温度(temperature) 输入华氏温度f,输出对应的摄氏温度c,保留3位小数。提示:c=5(f-32)/9。 c: #include <stdio.h> int main() { int f; scanf("%d", &f); double c = 5 * ((double)f - 32) / 9; printf("%.3f\n", c); return 0; } python: # -*- coding: utf-8 -*- # c=5(f-32)/9 f = float(input()) c = (5 * (f - 32)/9) print('%.3f' % (c)) 习题1-3 连续和(sum) 输入正整数n,输出 1+2+…+n的值。提示:目标是解决问题,而不是练习编程。 #include <stdio.h> int main() { int n, sum = 0; scanf("%d", &n); for (int i = 1; i <= n; ++i) { sum += i; } printf("%d\n", sum); return 0; } 习题1-4 正弦和余弦(sin 和 cos) 输入正整数n(n<360),输出n度的正弦、余弦函数值。提示:使用数学函数。 #include <stdio.h> #include <math.h> // use acos(-1.0) to calc π #define j2h(x) (acos(-1.0)*(x)/180.0) int main() { int in, n; scanf("%d", &in); n = (double)(in); printf("%f, %f\n", sin(j2h(n)), cos(j2h(n))); return 0; } 习题1-5 打折(discount) 一件衣服95元,若消费满300元,可打八五折。输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。 #include <stdio.h> int main() { const int one = 95; int n; double sum = 0.0; scanf("%d", &n); sum = n * one; if (sum >= 300) { sum *= 0.85; } printf("%.2f\n", sum); return 0; } 习题1-6 三角形(triangle) 输入三角形3条边的长度值(均为正整数),判断是否能为直角三角形的3个边长。如果可以,则输出yes,如果不能,则输出no。如果根本无法构成三角形,则输出not a triangle。 #include <stdio.h> #include <math.h> int main() { int a, b, c; scanf("%d%d%d", &a, &b, &c); if (pow(c, 2) == (pow(a, 2) + pow(b, 2))) { printf("yes\n"); } else if ((a + b) > c) { printf("no\n"); } else { printf("not a triangle\n"); } return 0; } 习题1-7 年份(year) 输入年份,判断是否为闰年。如果是则输出yes,否则输出no。 提示:简单地判断除以4的余数是不够的。 #include <stdio.h> int main() { int y; scanf("%d", &y); // 闰年是公历中的名词。闰年分为普通闰年和世纪闰年。普通闰年:能被4整除但不能被100整除的年份为普通闰年;世纪闰年:能被400整除的为世纪闰年。 if ((y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0))) { printf("yes\n"); } else { printf("no\n"); } return 0; }