第二章 循环结构程序设计

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时,输出如下:

alt

寻找规律,按层循环即可

#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类型,以避免整数除法产生的精度问题。另外,在输出时,我们使用了格式化字符串来控制输出的精度。

C语言用printf控制输出n位小数

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!')
全部评论

相关推荐

2 1 评论
分享
牛客网
牛客企业服务