2-1 水仙花数(daffodil)
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A^3+B^3+C^3,则称其为水仙花数。例如:153=1^3+5^3+3^3,所以153是水仙花数。
#include <iostream>
int main() {
std::cout << "Hello World!";
return 0;
}
#include <stdio.h>
#include <math.h> //含pow函数
int main() {
for (int i = 100; i <= 999; i++) {
int a = i % 10; //个位
int b = (i / 10) % 10; //十位
int c = i / 100; //百位
if (pow(a, 3) + pow(b, 3) + pow(c, 3) == i) { //pow函数求次方
printf("%d\n", i);
}
}
return 0;
}
print('Hello world!')
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
#include <iostream>
int main() {
std::cout << "Hello World!";
return 0;
}
#include <stdio.h>
#pragma warning(disable : 4996)//VS2022中scanf已已经弃用,改为更安全的scanf_s,此行可以忽略编译器的警告
#define LOCAL
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int a, b, c,kase=0,t;
while (scanf("%d%d%d", &a, &b, &c) != EOF) {
if (kase)
printf("\n");
kase++;
t = 0;
for (int i = 10; i <= 100; i++) {
if (i % 3 == a && i % 5 == b && i % 7 == c) {
printf("Case %d: %d",kase, i);
t = 1;
break;
}
}
if(t==0)
printf("Case %d: No anwser", kase);
}
return 0;
}//与书上例题类似,可以看本章书中介绍,疑问请@
print('Hello world!')
这边输入是这样的,while (scanf("%d%d%d", &a, &b, &c) != EOF) ,每次判断是否有输入。当想要停止输入时只需要输入三次ctrl+z并回车。
2-3 倒三角形(triangle)
输入正整数n≤20,输出一个n层的倒三角形。例如:n=5时,输出如下:
寻找规律,按层循环即可
#include <iostream>
int main() {
std::cout << "Hello World!";
return 0;
}
#include <stdio.h>
#pragma warning(disable : 4996)
int main() {
int n, i, j;
//printf("请输入正整数n(n≤20):");
scanf("%d", &n);
for (i = n; i >= 1; i--) {
for (j = 1; j <= n - i; j++)
printf(" ");
for(j = 1; j <= i*2-1; j++) {
printf("#");
}
printf("\n");
}
return 0;
}
print('Hello world!')
2-4 子序列的和(subsequence)
输入两个正整数n<m<10^6,输出1/n^2+1/(n+1)^2+...+1/m^2,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。
样例输入
2 4
65536 655360
0 0
样例输出
Case 1: 0.42361
Case 3: 0.00001
#include <iostream>
int main() {
std::cout << "Hello World!";
return 0;
}
#include <stdio.h>
#pragma warning(disable : 4996)
#include <math.h>
int main() {
int n, m, i,cnt=0;
double sum = 0;
while (1) {
scanf("%d %d", &n, &m);
if (n == 0 && m == 0) {
break;
}
for (i = n; i <= m; i++) {
sum += 1.0 / pow(i, 2);
}
printf("Case %d: %.5lf\n", ++cnt, sum);
sum = 0;
}
return 0;
}
print('Hello world!')
陷阱是啥,莫非是这里不能用float?因为float精度有限。
2-5 分数化小数(decimal)
输入正整数a、b、c,输出a/b的小数形式,精确到小数点后c位。a,b≤10^6,c≤100。输入包含多组数据,结束标记为a=b=c=0。
样例输入
1 6 4
0 0 0
样例输出
Case 1: 0.1667
#include <iostream>
int main() {
std::cout << "Hello World!";
return 0;
}
#include <stdio.h>
#include <math.h>
int main() {
int a, b, c;
char str[20];
double x;
while (1) {
scanf("%d %d %d", &a, &b, &c);
sprintf(str, "%s%d%c%c", "%.", c, 'f','\n');//用到sprintf
if (a == 0 && b == 0 && c == 0) {
break;
}
x = (double)a / b;
printf(str, x);
}
return 0;
}
print('Hello world!')
在实现过程中,我们使用了一个while循环来不断输入数据,直到遇到结束标记(a=b=c=0)。在每次输入一组数据后,我们将a强制转换为double类型,然后计算出a/b的小数形式,并使用printf函数输出结果。由于我们无法直接printf("%.cf",x)来控制输出c位小数,所以我们需要sprintf函数将格式化字符信息输入到str中。
需要注意的是,由于输入的整数a和b可能非常大,因此在进行除法运算时需要使用强制类型转换将a转换为double类型,以避免整数除法产生的精度问题。另外,在输出时,我们使用了格式化字符串来控制输出的精度。
2-6 排列(permutation)
用1,2,3...9组成3个三位数abc,def 和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。
#include <stdio.h>
int sum(int i)
{
int a, b, c;
a = i / 100;
b = i / 10 % 10;
c = i % 10;
return (a + b + c);
}//计算数位和
int mult(int i)
{
int a, b, c;
a = i / 100;
b = i / 10 % 10;
c = i % 10;
return (a * b * c);、
}//计算数位积
int main()
{
int e = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9;
for (int i = 123; i <= 329; ++i)//最大数为987,所以abc最大为987/3
{
int j = 2 * i;//def
int k = 3 * i;//ghi
if ((sum(i) + sum(j) + sum(k) == 45) && mult(i) * mult(j) * mult(k) == e)
printf("%d:%d:%d\n", i, j, k);//当数位和为45且数位积正确时输出答案
}
return 0;
}
print('Hello world!')