天天看點

《算法競賽入門經典 第2版》第2章課後題題解(一)

習題2-1 水仙花數(daffodil)

題目:輸出100-999中的所有水仙花數。若3位數ABC滿足ABC=A^3+B^3+C^3,則稱其為水仙花數。例如153=1^3+5^3+3^3,是以153是水仙花數。

題解:

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

運作結果:

《算法競賽入門經典 第2版》第2章課後題題解(一)

習題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<stdio.h>
int main()
{
    int a,b,c,n,i = 1;
    scanf("%d%d%d",&a,&b,&c);
    for(n = 10;n < 101;n++){
        if(n % 3 == a && n % 5 == b && n % 7==c){
            i = 0;
            break;
        }
    }
    if(i){
        printf("No answer\n");
    }else{
        printf("總人數 = %d\n",n);
    }
    return 0 ;
}
           

習題2-3 倒三角形(triangle)

題目:輸入正整數n<=20,輸出一個n層的倒三角形,例如n=5時輸出如下:

#########

 #######

  #####

   ###

    #

題解:

#include<stdio.h>
int main()
{
    int n,i,k,j;
    scanf("%d",&n);
    if(n > 0 && n <= 20){
       for(i = n;i > 0;i--){
           for(k = n - i;k > 0;k--){
              printf(" ");
            }
            for(j = 0;j < 2 * i - 1;j++){
               printf("#");
            }
            printf("\n");
        }
    }
    return 0;
}
           

習題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 2:0.00001

題解:

#include<stdio.h>
int main()
{
    int n,m;
    double sum = 0.0;
    scanf("%d%d",&n,&m);
    if(n < m < 1e+6){
        for( ;n <= m;n++){
            sum += (double)((1.0/n)*(1.0/n));
            if(n == 0 && m == 0){
                break;
            }
        }
        printf("%.5f\n",sum);
    }
     return 0;
}