1. 程式人生 > >C語言經典程式100例

C語言經典程式100例

【程式1】

題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月

   後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?

1.程式分析: 兔子的規律為數列1,1,2,3,5,8,13,21....

2.程式原始碼:

#include<stdio.h>

void main(){

         long f1,f2;                                     //前兩個月的兔子數

         f1=f2=1;

         for(int i=1;i<=20;i++){                         //i為月份

                   printf("%12ld %12ld ",f1,f2);

                   if(i%2==0) printf("\n");              //每行輸出4個

                   f1=f1+f2;                   //前兩個月加起來賦值給第三個月

                   f2=f2+f1;

         }

}

/*

           1            1            2            3

           5            8           13           21

          34           55           89          144

         233          377          610          987

        1597         2584         4181         6765

       10946        17711        28657        46368

       75025       121393       196418       317811

      514229       832040      1346269      2178309

     3524578      5702887      9227465     14930352

    24157817     39088169     63245986    102334155

Press any key to continue

*/

==============================================================

【程式2】

題目:判斷101-200之間有多少個素數,並輸出所有素數。

1.程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,

      則表明此數不是素數,反之是素數。       

2.程式原始碼:

#include<stdio.h>

#include<math.h>

void main(){

         int k=0,leap=1;

         for(int n=101;n<=200;n++){              //101--200

                   for(int i=2;i<=sqrt(n);i++){         //2--sqrt(i)

                            if(n%i==0){

                                     leap=0;

                                     break;

                            }

                   }

                   if(leap){

                            printf("%-4d",n);

                            k++;

                            if(k%10==0) printf("\n");

                   }

                   leap=1;

         }

         printf("\nThe total is %d\n",k);

}

/*

101 103 107 109 113 127 131 137 139 149

151 157 163 167 173 179 181 191 193 197

199

The total is 21

Press any key to continue

*/

==============================================================

【程式3】

題目:打印出所有的“水仙花數”,所謂“水仙花數”是指一個三位數,其各位數字立方和等於該數

   本身。例如:153是一個“水仙花數”,因為153=1的三次方+5的三次方+3的三次方。

1.程式分析:利用for迴圈控制100-999個數,每個數分解出個位,十位,百位。

2.程式原始碼:

#include<stdio.h>

void main(){

         int a,b,c;

         int n;

         printf("water flower'munber is: ");

         for(n=100;n<=999;n++){

                   a=n/100;  //百位

                   b=n%100/10;   //十位

                   c=n%10;            //個位

                   if(n=a*a*a+b*b*b+c*c*c){

                            printf("%5d ",n);

                   }

         }

         printf("\n");

}

/*

water flower'munber is:     1     8   729   370   371   378  1099

Press any key to continue

*/

==============================================================

【程式4】

題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。

程式分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:

(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。

(2)如果n<>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作為新的正整數你n,

 重複執行第一步。

(3)如果n不能被k整除,則用k+1作為k的值,重複執行第一步。

2.程式原始碼:

#include<stdio.h>

void main(){

         int n;

         printf("Please input a number: ");

         scanf("%d",&n);

         printf("%d= ",n);

         for(int i=2;i<=n;i++){

                   while(n!=i){

                            if(n%i==0){

                                     printf("%d * ",i);

                                     n=n/i;

                            }else

                                     break;

                   }

         }

         printf("%d",n);

         printf("\n");

}

/*

Please input a number: 90

90= 2 * 3 * 3 * 5

Press any key to continue

*/

==============================================================

【程式5】

題目:利用條件運算子的巢狀來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示,

   60分以下的用C表示。

1.程式分析:(a>b)?a:b這是條件運算子的基本例子。

2.程式原始碼:

#include<stdio.h>

void main(){

         int score;

         char grade;

         printf("Please input a score: ");

         scanf("%d",&score);

         grade=score>=90?'A':(score>=60?'B':'C');

         printf("%d belongs to %c \n",score,grade);

}

/*

Please input a score: 91

91 belongs to A

Press any key to continue

Please input a score: 87

87 belongs to B

Press any key to continue

Please input a score: 50

50 belongs to C

Press any key to continue

*/

==============================================================

【程式6】

題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。

1.程式分析:利用輾除法。

2.程式原始碼:

#include<stdio.h>

void main(){

         int m,n,temp,a,b;

         printf("Please input two numbers: ");

         scanf("%d %d",&m,&n);

         if(m<n){

                   temp=m;

                   m=n;

                   n=temp;

         }

         a=m;

         b=n;

         while(b!=0){

                   temp=a%b;

                   a=b;

                  b=temp;

         }

         printf("最大公約數為:%d\n",a);

         printf("最小公倍數為:%d\n",n*m/a);

}

/*

Please input two numbers: 12 3

最大公約數為:3

最小公倍數為:12

Press any key to continue

*/

==============================================================

【程式7】

題目:輸入一行字元,分別統計出其中英文字母、空格、數字和其它字元的個數。

1.程式分析:利用while語句,條件為輸入的字元不為'\n'.

2.程式原始碼:

#include<stdio.h>

void main(){

         char c;

         int letters=0,space=0,digit=0,others=0;  //字母、空格、數字、其他字元

         printf("Please input some characters\n");

         while((c=getchar())!='\n'){

                   if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))

                            letters++;

                   else if(c==' ')

                            space++;

                   else if(c>='0'&&c<='9')

                            digit++;

                   else

                            others++;

         }

         printf("all in all: English letters=%d space=%d digit=%d others=%d\n",letters,space,digit,others);

}

/*

Please input some characters

QJ3409V3O TEU40T93EJT934 34erj%j*a4

all in all: English letters=16 space=2 digit=15 others=2

Press any key to continue

*/

==============================================================

【程式8】

題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時

   共有5個數相加),幾個數相加有鍵盤控制。

1.程式分析:關鍵是計算出每一項的值。

2.程式原始碼:

#include<stdio.h>

void main(){

         int a,n,count=1;   //數字a,n個數相加

         long sn=0,tn=0;

         printf("Please input a and n: ");

         scanf("%d %d",&a,&n);

         printf("a=%d,n=%d\n",a,n);

         while(count<=n){

                   tn=tn+a;

                   sn=sn+tn;

                   a=a*10;

                   ++count;

         }

         printf("a+aa+...=%d\n",sn);

}

/*

Please input a and n: 3 4

a=3,n=4

a+aa+...=3702

Press any key to continue

*/

==============================================================

【程式9】

題目:一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6=1+2+3.程式設計

   找出1000以內的所有完數。

1. 程式分析:請參照程式<--上頁程式14.

2.程式原始碼:

#include<stdio.h>

void main(){

         int k[10];

         int n,s,i,m;

         for(n=2;n<1000;n++){

                   i=-1;

                   s=n;

                   for(m=1;m<n;m++){

                            if(n%m==0){

                                     i++;

                                     s=s-m;

                                     k[i]=m;

                            }

                   }

                   if(s==0){

                            printf("%d is a wanshu\n",n);

                   }

         }

}

/*

6 is a wanshu

28 is a wanshu

496 is a wanshu

Press any key to continue

*/

main()

{

static int k[10];

int i,j,n,s;

for(j=2;j<1000;j++)

 {

 n=-1;

 s=j;

  for(i=1;i   {

   if((j%i)==0)

   { n++;

    s=s-i;

    k[n]=i;

   }

  }

 if(s==0)

 {

 printf("%d is a wanshu",j);

 for(i=0;i  printf("%d,",k[i]);

 printf("%d\n",k[n]);

 }

}

}

==============================================================

【程式10】

題目:一球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在

   第10次落地時,共經過多少米?第10次反彈多高?

1.程式分析:見下面註釋

2.程式原始碼:

#include<stdio.h>

void main(){

         float sn=100.0,hn=sn/2;

         int n;

         for(n=2;n<=10;n++){

                   sn=sn+2*hn;              //第n次落地時共經過的米數

                   hn=sn/2;            //第n次反彈高度

         }

         printf("the total of road is %f \n",sn);

         printf("the tenth is %f meters\n",hn);

}

/*

the total of road is 51200.000000

the tenth is 25600.000000 meters

Press any key to continue

*/

=============================================================

【程式11】

題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?

1.程式分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去掉不滿足條件的排列。

2.程式原始碼:

#include<stdio.h>

void main(){

         int i,j,k;

         int n=0;

         for(i=1;i<=4;i++){  //以下為三重迴圈

                   for(j=1;j<=4;j++){

                            for(k=1;k<=4;k++){

                                     if(i!=j&&j!=k&&i!=k){  //排除i、j、k相同的情況

                                               printf("%d,%d,%d     ",i,j,k);

                                               printf("the number is %d%d%d\n",i,j,k);

                                               n++;

                                     }

                            }

                   }

         }

         printf("\nA total of number is %d\n",n);

}

/*

1,2,3     the number is 123

1,2,4     the number is 124

1,3,2     the number is 132

1,3,4     the number is 134

1,4,2     the number is 142

1,4,3     the number is 143

2,1,3     the number is 213

2,1,4     the number is 214

2,3,1     the number is 231

2,3,4     the number is 234

2,4,1     the number is 241

2,4,3     the number is 243

3,1,2     the number is 312

3,1,4     the number is 314

3,2,1     the number is 321

3,2,4     the number is 324

3,4,1     the number is 341

3,4,2     the number is 342

4,1,2     the number is 412

4,1,3     the number is 413

4,2,1     the number is 421

4,2,3     the number is 423

4,3,1     the number is 431

4,3,2     the number is 432

A total of number is 24

Press any key to continue

*/

==============================================================

【程式12】

題目:企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可可提成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?

1.程式分析:請利用數軸來分界,定位。注意定義時需把獎金定義成長整型。      

2.程式原始碼:

#include<stdio.h>

void main(){

         long int i;

         int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;

         printf("Please input the profit I:");

         scanf("%ld",&i);

         bonus1=100000*0.1;

         bonus2=bonus1+100000*0.075;

         bonus4=bonus2+200000*0.05;

         bonus6=bonus4+200000*0.03;

         bonus10=bonus6+400000*0.015;

         if(i<=100000)

                   bonus=i*0.1;

         else if(i<=200000)

                   bonus=bonus1+(i-100000)*0.075;

         else if(i<=400000)

                   bonus=bonus2+(i-200000)*0.05;

         else if(i<=600000)

                   bonus=bonus4+(i-400000)*0.03;

         else if(i<=1000000)

                   bonus=bonus6+(i-600000)*0.015;

         else

                   bonus=bonus10+(i-1000000)*0.01;

         printf("bonus=%d\n",bonus);

}

/*

Please input the profit I:340000

bonus=24500

Press any key to continue

*/

==============================================================

【程式13】

題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?

1.程式分析:在10萬以內判斷,先將該數加上100後再開方,再將該數加上268後再開方,如果開方後的結果滿足如下條件,即是結果。請看具體分析:

2.程式原始碼:

#include<stdio.h>

#include<math.h>

void main(){

         long int i,x,y;

         for(i=1;i<100000;i++){

                   x=sqrt(i+100);//x為加上100後開方後的結果

                   y=sqrt(i+268);//y為再加上168後開方後的結果

                   if(x*x==i+100&&y*y==i+268)//如果一個數的平方根的平方等於該數,這說明此數是完全平方數

                            printf("the number is %ld\n",i);

         }

}

/*

the number is 21

the number is 261

the number is 1581

Press any key to continue

*/

==============================================================

【程式14】

題目:輸入某年某月某日,判斷這一天是這一年的第幾天?

1.程式分析:以3月5日為例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大於3時需考慮多加一天。

2.程式原始碼:

#include<stdio.h>

void main(){

         int day,month,year,sum,leap;

         printf("Please input year,month,day: ");

         scanf("%d %d %d",&year,&month,&day);

         switch(month){ //先計算某月以前月份的總天數

                   case 1:sum=0;break;

                   case 2:sum=31;break;

                   case 3:sum=59;break;

                   case 4:sum=90;break;

                   case 5:sum=120;break;

                   case 6:sum=151;break;

                   case 7:sum=181;break;

                   case 8:sum=212;break;

                   case 9:sum=243;break;

                   case 10:sum=273;break;

                   case 11:sum=304;break;

                   case 12:sum=334;break;

                   default:printf("data error");break;

         }

         sum=sum+day;  //再加上某天的天數

         if((year%4==0&&year%100!=0)||(year%400==0)) //判斷是否是閏年

                   leap=1;

         else

                   leap=0;

         if(leap==1&&month>2)     //如果是閏年且月份大於2,總天數應該加一天

                   sum++;

         printf("It is the %dth day.\n",sum);

}

/*

Please input year,month,day: 2019 3 1

It is the 60th day.

Press any key to continue

*/

==============================================================

【程式15】

題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。

1.程式分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。

2.程式原始碼:

#include<stdio.h>

void main(){

         int x,y,z,temp;

         printf("Please input three numbers:");

         scanf("%d %d %d",&x,&y,&z);

         if (x>y){   //交換x,y的值

                   temp=x;

                  x=y;

                   y=temp;

         }

         if(x>z){     //交換x,z的值

                   temp=x;

                   x=z;

                   z=temp;

         }

         if(y>z){     //交換z,y的值

                   temp=y;

                   y=z;

                   z=temp;

         }

         printf("small to big: %d %d %d\n",x,y,z);

}

/*

Please input three numbers:34 13 23

small to big: 13 23 34

Press any key to continue

*/

==============================================================

【程式16】

題目:用*號輸出字母C的圖案。

1.程式分析:可先用'*'號在紙上寫出字母C,再分行輸出。

2.程式原始碼:

#include <stdio.h>

void main(){

         printf("Hello C-world!\n");

         printf(" ****\n");

         printf(" *\n");

         printf(" * \n");

         printf(" ****\n");

}

/*

Hello C-world!

 ****

 *

 *

 ****

Press any key to continue

*/

==============================================================

【程式17】

題目:輸出特殊圖案,請在c環境中執行,看一看,Very Beautiful!

1.程式分析:字元共有256個。不同字元,圖形不一樣。      

2.程式原始碼:

#include <stdio.h>

void main(){

         char a=32,b=64;

         printf("%c%c%c%c%c\n",b,a,a,a,b);

         printf("%c%c%c%c%c\n",a,b,a,b,a);

         printf("%c%c%c%c%c\n",a,a,b,a,a);

         printf("%c%c%c%c%c\n",a,b,a,b,a);

         printf("%c%c%c%c%c\n",b,a,a,a,b);

}

/*

@   @

 @ @

  @

 @ @

@   @

Press any key to continue

*/

==============================================================

【程式18】

題目:輸出9*9口訣。

1.程式分析:分行與列考慮,共9行9列,i控制行,j控制列。

2.程式原始碼:

#include <stdio.h>

void main(){

         int i,j,result;

         for (i=1;i<=9;i++){

                   for(j=1;j<=9;j++){

                            result=i*j;

                            printf("%d*%d=%-3d",i,j,result);//-3d表示左對齊,佔3位

                   }

                   printf("\n"); //每一行後換行

         }

}

/*

1*1=1  1*2=2  1*3=3  1*4=4  1*5=5  1*6=6  1*7=7  1*8=8  1*9=9

2*1=2  2*2=4  2*3=6  2*4=8  2*5=10 2*6=12 2*7=14 2*8=16 2*9=18

3*1=3  3*2=6  3*3=9  3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27

4*1=4  4*2=8  4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36

5*1=5  5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45

6*1=6  6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54

7*1=7  7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63

8*1=8  8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72

9*1=9  9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

Press any key to continue

*/

==============================================================

【程式19】

題目:要求輸出國際象棋棋盤。

1.程式分析:用i控制行,j來控制列,根據i+j的和的變化來控制輸出黑方格,還是白方格。

2.程式原始碼:

#include<stdio.h>

void main(){

         int i,j;

         for(i=0;i<8;i++){

                   for(j=0;j<8;j++){

                            if((i+j)%2==0)

                                     printf("%c%c",219,219);

                            else

                                     printf(" ");

                   }

                   printf("\n");

         }

}

/*壙 壙 壙 壙

 壙 壙 壙 壙

壙 壙 壙 壙

 壙 壙 壙 壙

壙 壙 壙 壙

 壙 壙 壙 壙

壙 壙 壙 壙

 壙 壙 壙 壙

Press any key to continue

*/

==============================================================

【程式20】

題目:列印樓梯,同時在樓梯上方列印兩個笑臉。

1.程式分析:用i控制行,j來控制列,j根據i的變化來控制輸出黑方格的個數。

2.程式原始碼:

#include<stdio.h>

void main(){

         int i,j;

         printf("\1\1\n"); //輸出兩個笑臉

         for(i=1;i<11;i++){

                   for(j=1;j<=i;j++){

                            printf("%c%c",219,219);

                   }

                   printf("\n");

         }

}

/*

..

壙壙

壙壙壙

壙壙壙壙

壙壙壙壙壙

壙壙壙壙壙壙

壙壙壙壙壙壙壙

壙壙壙壙壙壙壙壙

壙壙壙壙壙壙壙壙壙

壙壙壙壙壙壙壙壙壙壙

Press any key to continue

*/

============================================================

【程式21】

題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個

   第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下

   的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。

1.程式分析:採取逆向思維的方法,從後往前推斷。

2.程式原始碼:

#include<stdio.h>

void main(){

         int day,x1,x2=1;

         for(day=9;day>0;day--){

                   x1=(x2+1)*2;  //第一天的桃子數是第2天桃子數加1後的2倍

                   x2=x1;

         }

         printf("the total is %d\n",x1);

}

/*

the total is 1534

Press any key to continue

*/

==============================================================

【程式22】

題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽籤決定

   比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請程式設計序找出

   三隊賽手的名單。

1.程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,

      則表明此數不是素數,反之是素數。       

2.程式原始碼:

#include<stdio.h>

void main(){

         char i,j,k;  //i是a的對手,j是b的對手,k是c的對手

         for(i='x';i<='z';i++){

                   for(j='x';j<='z';j++){

                            if(i!=j){

                                     for(k='x';k<='z';k++){

                                               if(i!=k&&j!=k){

                                                        if(i!='x'&&k!='x'&&k!='z')

                                                                 printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);

                                               }

                                     }

                            }

                   }

         }

}

/*

order is a--z   b--x    c--y

Press any key to continue

*/

==============================================================

【程式23】

題目:打印出如下圖案(菱形)

*

***

******

********

******

***

*

1.程式分析:先把圖形分成兩部分來看待,前四行一個規律,後三行一個規律,利用雙重

      for迴圈,第一層控制行,第二層控制列。

2.程式原始碼:

#include<stdio.h>

void main(){

         int i,j,k;

         for(i=0;i<=3;i++){

                   for(j=0;j<=2-i;j++){

                            printf(" ");

                   }

                   for(k=0;k<=2*i;k++){

                            printf("*");

                   }

                   printf("\n");

         }

         for(i=0;i<=2;i++){

                   for(j=0;j<=i;j++){

                            printf(" ");

                   }

                   for(k=0;k<=4-2*i;k++){

                            printf("*");

                   }

                   printf("\n");

         }

}

/*

   *

  ***

 *****

*******

 *****

  ***

   *

Press any key to continue

*/

==============================================================

【程式24】

題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。

1.程式分析:請抓住分子與分母的變化規律。

2.程式原始碼:

#include<stdio.h>

void main(){

         int n,t;

         float a=2,b=1,s=0;

         for(n=1;n<=20;n++){

                   s=s+a/b;

                   t=a;

                   a=a+b;

                   b=t;

         }

         printf("sum is %9.6f\n",s);

}

/*

sum is 32.660259

Press any key to continue

*/

==============================================================

【程式25】

題目:求1+2!+3!+...+20!的和

1.程式分析:此程式只是把累加變成了累乘。

2.程式原始碼:

#include<stdio.h>

void main(){

         float n,s=0,t=1;

         for(n=1;n<=20;n++){

                   t*=n;

                   s+=t;

         }

         printf("1+2!+3!...+20!=%e\n",s);

}

/*

1+2!+3!...+20!=2.561327e+018

Press any key to continue

*/

==============================================================

【程式26】

題目:利用遞迴方法求5!。

1.程式分析:遞迴公式:fn=fn_1*4!

2.程式原始碼:

#include<stdio.h>

int fact(int j){

         int sum;

         if(j==0)

                   sum=1;

         else

                   sum=j*fact(j-1);

         return sum;

}

void main(){

         int i;

         int fact(int);

         for(i=0;i<6;i++)

                   printf(" %d!=%d\n",i,fact(i));

}

/*

 0!=1

 1!=1

 2!=2

 3!=6

 4!=24

 5!=120

Press any key to continue

*/

==============================================================

【程式27】

題目:利用遞迴函式呼叫方式,將所輸入的5個字元,以相反順序打印出來。

1.程式分析:

2.程式原始碼:

#include<stdio.h>

void main(){

         int i=5;

         void palin(int n);

         printf("Please input five characters: ");

         palin(i);

         printf("\n");

}

void palin(int n){

         char next;

         if(n<=1){

                   next=getchar();

                   printf("the opposite characters is: ");

                   putchar(next);

         }

         else{

                   next=getchar();

                   palin(n-1);

                   putchar(next);

         }

}

/*

Please input five characters: rterd

the opposite characters is: dretr

Press any key to continue

*/

==============================================================

【程式28】

題目:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第

   3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後

   問第一個人,他說是10歲。請問第五個人多大?

1.程式分析:利用遞迴的方法,遞迴分為回推和遞推兩個階段。要想知道第五個人歲數,需知道

      第四人的歲數,依次類推,推到第一人(10歲),再往回推。

2.程式原始碼:

#include<stdio.h>

age(int n){

         int c;

         if(n==1)

                   c=10;

         else

                   c=age(n-1)+2;

         return c;

}

void main(){

         printf("the age of the five is: %d\n",age(5));

}

/*

the age of the five is: 18

Press any key to continue

*/

==============================================================

【程式29】

題目:給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。

1. 程式分析:學會分解出每一位數,如下解釋:(這裡是一種簡單的演算法,師專數002班趙鑫提供)

2.程式原始碼:

#include<stdio.h>

void main( ){

         long a,b,c,d,e,x;

         printf("Please input the number: ");

         scanf("%ld",&x);

         a=x/10000;                //分解出萬位

         b=x%10000/1000;   //分解出千位

         c=x%1000/100;                 //分解出百位

         d=x%100/10;            //分解出十位

         e=x%10;            //分解出個位

         if (a!=0)

                   printf("there are 5,  %ld %ld %ld %ld %ld\n",e,d,c,b,a);

         else if (b!=0)

                   printf("there are 4,  %ld %ld %ld %ld\n",e,d,c,b);

         else if (c!=0)

                   printf("there are 3,  %ld %ld %ld\n",e,d,c);

         else if (d!=0)

                   printf("there are 2,  %ld %ld\n",e,d);

         else if (e!=0)

                   printf("there are 1, %ld\n",e);

}

/*

Please input the number: 23458

there are 5,  8 5 4 3 2

Press any key to continue

*/

==============================================================

【程式30】

題目:一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。   

1.程式分析:同29例

2.程式原始碼:

#include<stdio.h>

void main( ){

         long ge,shi,qian,wan,x;

         printf("Please input a number: ");

         scanf("%ld",&x);

         wan=x/10000;

         qian=x%10000