《算法竞赛入门经典》习题答案 -- Chapter II

习题2-1 位数(digit)

题目:输入一个不超过10的9次方的正整数,输出它的位数,例如12735的位数是5。不使用任何数学函数。

分析:主要是考察循环的使用,while循环和for循环均可,择其一。

程序:

C语言: Codee#26555
01 #include <stdio.h>
02
03 int main()
04 {
05     int i = 0;
06     long long n = 0;
07
08     scanf( "%ld" , &n);
09     for ( i = 1; i <= 9; i ++)
10     {
11         if (n < 10)
12         {
13             break;
14         }
15         n = n / 10;
16     }
17     printf( "%d \n " , i);
18
19     return 0;
20
21 }


习题2-2 水仙花数(daffodil)

题目:输出100 ~ 999中的所有水仙花数,若3位数ABC满足ABC = A ^ 3 + B ^ 3 + C ^ 3(书中题目有误,均写成了平方),则称其为水仙花数。

分析:在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数或阿姆斯壮数(Armstrong number)是指一N位数,其各个数之N次方和等于该数。题目只考察了三位数这种情况。

程序:

C语言: Codee#26556
01 #include <stdio.h>
02
03 int main()
04 {
05     int i = 0; /* centesimal */
06     int j = 0; /* ten */
07     int k = 0; /* digit */
08     int num = 0;
09
10     for ( i = 1; i <= 9; i ++)
11     {
12         for ( j = 1; j <= 9; j ++)
13         {
14             for ( k = 1; k <= 9; k ++)
15             {
16                num = i * 100 + j * 10 + k;
17                if ( num == i * i * i + j * j * j + k * k * k)
18                {
19                     printf( "%d \n " , num);
20                }
21             }
22         }
23     }
24
25     return 0;
26 }


习题2-3 韩信点兵(hanxin)

题目:韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次都只是掠一眼队伍的排位就知道人数了。输入3个非负整数a,b,c,表示每种队形排尾的人数,输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100

分析:韩信点兵问题渊源颇深,且题目的难度变化非常大。题目出的,是最简单的一种了。程序中要注意对于无解这种情况的判断

程序:

C语言: Codee#26557
01 #include <stdio.h>
02
03 int main()
04 {
05     int a = 0;
06     int b = 0;
07     int c = 0;
08     int i = 0;
09     int flag = 0;
10
11     scanf( "%d %d %d" , & a , &b , & c);
12
13     /* check input numbers */
14     if (( a >= 3) || (b >= 5) || ( c >= 7) )
15     {
16         printf( "No answer. \n ");
17         return 0;
18     }
19
20     for ( i = 10; i <= 100; i ++)
21     {
22         if (( i % 3 == a) && ( i % 5 == b) && ( i % 7 == c))
23         {
24             printf( "%d \n " , i);
25             flag = 1;
26         }
27     }
28
29     /* does not got the answer  */
30     if ( flag == 0)
31     {
32         printf( "No answer. \n ");
33     }
34
35     return 0;
36 }


习题 2-4 倒三角形(triangle)

题目:输入正整数n<=20,输出一个n层的倒三角形。

分析:比较经典的循环问题了,注意空格和#的比例

程序:

C语言: Codee#26558
01 #include <stdio.h>
02
03 int main()
04 {
05     int i = 0;
06     int j = 0;
07     int k = 0;
08     int n = 0;
09
10     scanf( "%d" , &n);
11     for ( i = n; i > 0; i --)
12     {
13         /* print space  */
14         for ( k = 0; k < n - i; k ++)
15         {
16             printf( " ");
17         }
18
19         /* print #  */
20         for ( j = 0; j < 2 * i - 1; j ++)
21         {
22             printf( "#");
23         }
24
25         printf( " \n ");
26     }
27
28     return 0;
29 }


习题 2-5 统计(stat)

题目:输入一个正整数n,然后读取n个正整数a1, a2, a3...,an,最后再读取一个正整数m。统计数列中多少个正整数的值小于m。

分析:程序不难,使用了数组,这本是在第三章介绍的内容。我之所以这么做是因为网上广泛流传的答案都不太厚道。

程序:

C语言: Codee#26559
01 #include <stdio.h>
02
03 #define MAX_LEN 100 + 10
04
05 int main()
06 {
07     int i = 0;
08     int n = 0;
09     int m = 0;
10     int counter = 1;
11     int a [ MAX_LEN ] = { 0 };
12     FILE * pfile = NULL;
13
14     pfile = fopen( "data.in" , "rb");
15
16     scanf( "%d" , &n);
17     for ( i = 0; i < n; i ++)
18     {
19         fscanf( pfile , "%d" , & a [ i ]);
20     }
21     fscanf( pfile , "%d" , & m);
22
23     for ( i = 0; i < n; i ++)
24     {
25         if ( a [ i ] < m)
26         {
27             counter ++;
28         }
29     }
30
31     fclose( pfile);
32     pfile = NULL;
33
34     printf( "%d \n " , counter);
35
36     return 0;
37 }




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值