算法竞赛入门经典第二版-第二章习题

本文精选了五个经典的C语言编程题目,包括寻找水仙花数、解决韩信点兵问题、绘制倒三角形等,并提供了详细的代码实现及解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2-1

输出100~999中的所有水仙花数。若3位数ABC满足ABC=A3+B3+C3,则称其为水仙花

数。例如153=13+53+33,所以153是水仙花数。

#include<stdio.h>
int main()
{
    int a,b,c;
    for(int i=100;i<999;i++){
        a=i/100;
        b=i/10%10;
        c=i%10;
        if(i==a*a*a+b*b*b+c*c*c)
            printf("%d\n",i);
    }
    return 0;
}

2-2 

#include <stdio.h>
/*相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人
一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组
数据,每组数据包含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*/
int main()
{
    int i,a,b,c;
    scanf("%d%d%d\n",&a,&b,&c);
    for(i=10;i<=100;i++){
       if(i%3==a&&i%5==b&&i%7==c)
            printf("%d\n",i);
    }
    if(i==100)
         printf("No answer");
    return 0;
}

2-3

#include <stdio.h>
/*输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
#########
 #######
  #####
   ###
    #*/
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=n;i>=1;i--){ //n层
        for(int j=n;j>i;j--) // 输出每一行的空格数
            printf(" ");
        for(int k=0;k<2*i-1;k++)//输出每一行的#数等于2*i-1
            printf("#");
        printf("\n");
        }
    return 0;
}

C++:

for (i = n; i > 0; i--) {

for (j = 0; j < n - i; j++) cout << " ";

for (j = 0; j < 2*i-1; j++) cout << "#";

cout << "\n"; }

2-4

#include <stdio.h>
//注:陷阱就是在n特别大时如果直接n*n就会溢出,所以只能连除两次
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    double sum=0;
    for(int i=n;i<=m;i++)
        //sum +=1.0/((n+i)*(n+i));
        sum+=1.0/i/i;
        printf("%.5f\n",sum);
    return 0;
}

2-5

#include <stdio.h>
/*输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤106,c≤100。输
入包含多组数据,结束标记为a=b=c=0*/
int main()
{
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    printf("%.*lf\n",c,(double)a/b);
    return 0;
}

2-6

用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。

#include<stdio.h>
int is_valid_number(int num, int array[])
{
    int x, y, z;
    x = num / 100;
    y = num / 10 % 10;
    z = num % 10;
    if (x == y || y == z || array[x] || array[y] || array[z]) {
        // Digit used
        return 0;
    }
    array[x] = array[y] = array[z] = 1;
    return 1;
}
int main()
{
    int array[10];
    array[0] = 1;
    for (int checked_num = 123; checked_num < 329; checked_num++ )
    {
        for (int i = 1; i < 10; i++)
            array[i] = 0;
        if (is_valid_number(checked_num, array)
            && is_valid_number(checked_num*2, array)
            && is_valid_number(checked_num*3, array))
        {
            printf("%d %d %d\n",checked_num,checked_num*2,checked_num*3);
        }
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值