【程序16】 ( w# {6 @' j' C/ l0 z
題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 ' Y Y/ }+ i, J
0 w7 i. \( E0 ?1 b
# }! P7 _$ y4 q* ~5 o
& i1 R, r4 A! t1 u' i9 i+ N作者: zhlei81 2005-1-22 11:30 回復此發言 ; ^8 [5 j: m: ~+ N
) C! W. F; z; h; C ~5 r
-------------------------------------------------------------------------------- 0 p3 P0 v9 a- j9 I" T8 g
9 \8 M8 V: V* A W8 f
4 回復:經典C源程序100例 9 @. ~3 _* ^9 W4 V1 g
1.程序分析:利用輾除法。
5 J2 t, K# |6 U) H- E. s7 K4 ~7 e8 `. \! r* G3 x1 r8 f. \ @: N
2.程序源代碼:
. O. G3 h) M6 ^' }0 {3 lmain() 4 U* F' }+ [7 }; V/ X' g
{ 1 P& s/ }" ^$ v' }- ^
int a,b,num1,num2,temp;
6 O' p( S+ E) C- rprintf("please input two numbers:\n");
/ M! e( Y m/ b4 \) ^9 Wscanf("%d,%d",&num1,&num2); 6 r' _; E8 V2 c% u3 F
if(num1 { temp=num1;
) E% L4 }9 m9 i U6 o, ?$ onum1=num2; # f# D& p/ {1 I y; T
num2=temp; / w" p+ D: k: c+ j2 ^
}
j1 f8 c" c1 S9 v* b1 j! w( g xa=num1;b=num2; 5 ]# Z6 Y5 Y5 ?3 j. O
while(b!=0)/*利用輾除法,直到b為0為止*/
6 j& a1 m$ q- W z$ i% L* `{ 4 I1 ~% K9 Q3 c5 g! P, ~
temp=a%b; 5 e# D% O! B9 R2 q
a=b; / A+ j( G: M$ T/ q0 m
b=temp; ' m( G) U. a, Y* X5 b
}
. m: P$ H5 r% @; h+ _ M7 rprintf("gongyueshu:%d\n",a);
7 D( k, Z# F6 R) y4 vprintf("gongbeishu:%d\n",num1*num2/a); : j) p- l5 O" B$ y# M" k
}
2 k; s6 M0 `* y* I3 E==============================================================
' L2 t/ C; Y+ J【程序17】 6 N% k/ U$ R, V$ }) L: r9 a9 F
題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。
6 J# d/ Z; U2 P- k- K3 y1.程序分析:利用while語句,條件為輸入的字符不為'\n'.
/ c) @5 D9 N- W. r- D5 V' x" M ~! m4 S3 _$ F+ k
2.程序源代碼:
2 {: o0 S) }+ b" K/ @; l/ Y# D#include "stdio.h" $ g* y1 q2 o8 z& y& k: P3 J" v
main() ( `8 Y+ |4 Q+ c6 }& B0 k3 G' X+ \- Y, }. J
{char c;
9 E$ r# o) U/ H4 p. e: mint letters=0,space=0,digit=0,others=0;
( P0 h( d) ?) Q4 d; u1 |+ @8 Bprintf("please input some characters\n");
$ K5 U+ R4 n; U4 Lwhile((c=getchar())!='\n') ) c! T- K, I* S& H4 V6 f
{ . z2 [/ P L) E* b
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
, I6 N% k& D! s$ C$ wletters++;
" U% g- O5 [/ `6 e c2 A6 e, ielse if(c==' ')
: n0 E: Z6 h" o; [# I6 h7 {space++; / g2 l8 [ O' k+ w# X
else if(c>='0'&&c<='9')
- X5 _# u9 j0 o: g6 \6 Qdigit++; 2 b# _3 `! `% ]( E6 l! ?! b
else
3 E& A1 O ^) C4 ~" O J2 H1 \% Zothers++; $ v9 s# E2 t! v4 o5 d( Z
}
# ]5 L. C. J: s7 Q/ l; g2 M0 G: t/ zprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters, , ?. @& L; m# J7 y! @/ t. [2 `
space,digit,others); 9 w& } h$ i- R3 T$ N
}
8 L: q+ n9 K/ G% S3 ^6 U; z============================================================== ( y7 G7 n1 g3 m
【程序18】
& M/ e0 [9 n8 c5 q題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時
2 ^. s3 ~* e9 _' T" |7 f1 {9 g共有5個數相加),幾個數相加有鍵盤控制。 ' a. V4 c" `! W3 ? E- k
1.程序分析:關鍵是計算出每一項的值。 ) }, B6 y' u* R: E) J
2.程序源代碼:
+ _) w( K) Q, N6 Amain()
/ m, G* V9 {( H, H{
" u3 \ u' U% w6 bint a,n,count=1; 8 X! k; m+ T- S& D
long int sn=0,tn=0;
8 U4 b* ~: r' z4 tprintf("please input a and n\n");
, K1 L& h& C5 Lscanf("%d,%d",&a,&n);
7 I1 e- Y* O. T! u! _9 ?printf("a=%d,n=%d\n",a,n); 3 v4 H. T% _6 v
while(count<=n)
: t/ Q- [- M: D' [: v0 e$ R{
9 W" J i4 m+ S- H4 G3 I; K, Ptn=tn+a;
: r! r# R: |) ~2 Y7 ~+ e0 Jsn=sn+tn; / O; H4 H& `3 K/ I n# S* N% P
a=a*10;
C8 o$ R8 W- m! T0 a++count;
+ w6 U" ^3 _% I5 n# c. n} % x9 o/ `2 x: G2 i3 M& S
printf("a+aa+...=%ld\n",sn);
9 F2 ]* u5 c$ u: c6 t* f}
9 S4 f1 L0 z _0 W0 y==============================================================
% t% W3 I: I2 k3 _' o# ]* u5 }" C【程序19】 # s% s3 `; m- ? b' _1 Z0 Q/ x8 A0 R
題目:一個數如果恰好等于它的因子之和,這個數就稱為“完數”。例如6=1+2+3.編程 + z# l% P5 M, Z6 t
找出1000以內的所有完數。 6 F+ q. k: P L- s$ C% D
1. 程序分析:請參照程序<--上頁程序14. 7 o N, ^* U0 `$ ]: c
2.程序源代碼:
% t( P3 Q" y7 p" nmain() 0 C' y U4 z4 W7 V# l
{
5 P! ? e/ n# P7 R" Bstatic int k[10];
% Y2 ]' o0 }3 |2 n: e0 ~# kint i,j,n,s;
D# o2 u4 ]! z$ tfor(j=2;j<1000;j++)
, G3 _/ C5 I! F" x. z \. D" M{ ( J! r* x4 y# |# U
n=-1; + a( b# u, f# C3 V
s=j; 8 _8 \$ h' H, r* e4 w' S
for(i=1;i { ; ?5 P# |/ q% S+ L* v
if((j%i)==0)
+ H# i4 ~4 K; I/ [! T{ n++;
1 C* ` I k8 c x3 w9 Ys=s-i;
7 N( ^- [" `1 k0 H( D) {k[n]=i;
8 {0 J4 v& R0 F}
n; s+ A0 l) _( j9 g} 8 D& i4 K4 o- O0 g1 [
if(s==0) 6 S, f. c* r) \1 G
{
1 @* `& N. O4 n3 Z uprintf("%d is a wanshu",j); ! X5 j4 N' `, D7 w" G1 `% b
for(i=0;i printf("%d,",k); 9 Y5 d1 x$ l% z
printf("%d\n",k[n]); ' [# B5 A, [7 j( l7 |* I0 ]9 V
}
4 O* j$ K% A7 q4 q$ Y}
; f {% v4 w# L) a5 @}
9 c z2 ~- T" [% Y* b* v==============================================================
2 r% y2 B3 c3 Q- D& s; R【程序20】
/ b/ W( U' E+ X5 A4 J4 O4 M題目:一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
; g' S9 V/ S8 R第10次落地時,共經過多少米?第10次反彈多高? 5 Z/ R6 ]) z3 o! M9 y" i
1.程序分析:見下面注釋
n" P' o- P1 U( b' k+ B2.程序源代碼: & b% `3 G1 W# J+ c# u# l; W& n
main()
/ i( P- C, k1 I8 z{ . I p$ p; t! _ t1 h! b
float sn=100.0,hn=sn/2;
3 A$ B! L) ?8 d; T {int n; , l7 d. l% S+ _. J
for(n=2;n<=10;n++)
; o. j1 Q+ x( y8 X. h& v+ s{ - C+ S- \) Y/ k( @9 f
sn=sn+2*hn;/*第n次落地時共經過的米數*/
- T" L; a- X+ k7 R0 Y" phn=hn/2; /*第n次反跳高度*/ 8 _& H1 F7 n. A) _8 Z4 s
}
4 u* q$ Y2 P; m5 @" t' k5 [9 H' vprintf("the total of road is %f\n",sn);
" q2 V$ Y1 S4 `: mprintf("the tenth is %f meter\n",hn);
8 G+ x8 Q2 b# \0 a8 l+ f* G} 【程序21】 題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個
0 r# G% P( F9 X6 @0 Z 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下
( }- Z7 E o: }7 o5 e* a 的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。6 i" l, ?+ J6 x7 W$ Q1 y
1.程序分析:采取逆向思維的方法,從后往前推斷。' W- Z8 r4 C6 T2 `+ h
2.程序源代碼:
+ X7 c+ @$ g& K$ K& P( S# }main()0 ?1 X9 l7 F. q- C3 ^
{$ h* m; X/ S8 H" b& H/ X/ C9 c
int day,x1,x2;' }+ r- y7 [8 W6 f i% H
day=9;& Q/ F) V7 s' w! w, B
x2=1;: ]) ~% b- n* `4 q2 N& t/ h
while(day>0). j9 @; x! p9 z
{x1=(x2+1)*2;/*第一天的桃子數是第2天桃子數加1后的2倍*/8 o# B) e5 o9 }( d
x2=x1;5 p1 v6 I; ~/ c
day--;( } R9 {7 }3 ~0 u) Q4 E6 ~
}
, n/ y2 U4 Q9 G; sprintf("the total is %d\n",x1);
2 a; O" t* V, ~" b( _' y}( } p8 n( V- {7 e' M
==============================================================
5 s4 ]0 }9 n% }3 }9 q+ u【程序22】
* {3 _' z, q' K: _6 O1 U題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定
3 F' P2 h& g, w+ x' } _ 比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出! R: e0 ?& }7 h# ^9 S
三隊賽手的名單。
, i) D* t$ H4 A* J: t# g0 G/ N, u1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, M1 D6 N5 ~0 Y; o6 [% N
則表明此數不是素數,反之是素數。 2 R/ ?- D' N+ A p3 J# g
2.程序源代碼:
7 }0 l$ W! k/ ? a6 s% _" x$ amain()! P. ?& K G( @2 u$ h+ ^1 K6 H9 L
{
7 H) u" T7 ]5 w6 [$ @* b# wchar i,j,k;/*i是a的對手,j是b的對手,k是c的對手*/
8 c! G G# u0 _. K: \0 b, H0 qfor(i='x';i<='z';i++)3 `3 i. V. |/ C: u3 M4 r! m F
for(j='x';j<='z';j++)4 I: ?4 B/ l( ]9 d. F8 s
{( L9 ^% J5 `4 d0 a4 W/ o- c3 \
if(i!=j)
. B" b( q0 b) A' S6 h, v# q for(k='x';k<='z';k++)$ P# F6 S& X! ?2 T2 F
{ if(i!=k&&j!=k)
+ [8 E! L ^! y6 }' S4 H4 { { if(i!='x'&&k!='x'&&k!='z')
+ N6 b7 e& Q) |& U, }; { printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);3 p: ^2 [9 q6 N- ~* d
}
$ s9 w4 C3 B# D c, @ }
4 D- e6 P/ R5 P% ]! J) b" ]% O5 \9 g }
. C! k/ M9 l$ P' `9 K. v}
$ `. h4 C8 ^4 \# n==============================================================. K" }5 f1 O H2 {
【程序23】 ( }* D G3 s1 K1 H. a+ |3 d) c
題目:打印出如下圖案(菱形) *# y2 I+ V6 O2 z% B+ K3 T; m
***
& g& K3 I( C1 Q/ O4 Y$ Q******0 M+ R9 Z+ R! E% M m* J9 M6 @" ]
********( f6 Z- u4 ]: i( J" f, z
******
$ B8 R- u$ W5 Y5 q* t4 N3 _4 |* `***
' J. H# Y5 `( t. y; u*5 S, p. N6 T& |3 ]6 U5 n
1.程序分析:先把圖形分成兩部分來看待,前四行一個規律,后三行一個規律,利用雙重
) S. {) W3 v& B) U! O( X$ ]. n for循環,第一層控制行,第二層控制列。
, `7 i4 ]8 O$ c7 S7 W6 x2.程序源代碼:
4 o! ?6 k: r& v4 x4 L4 p! v! v* Emain()
% m/ C) K. V2 v. f% v" J' C{( ^2 \5 Z ^1 m+ r2 _7 M- ^3 ?& S
int i,j,k;
1 r5 r* s& \6 F+ ?2 B% I8 K! a/ lfor(i=0;i<=3;i++)
9 j* c& J) ^& l! X( {1 Y/ E# ] {
$ ^* h7 g# s3 @" Z, y( v for(j=0;j<=2-i;j++)
3 S6 s7 m1 }& m# V7 w& N printf(" ");
, d8 S$ Y6 \/ ^" q& u6 U# L' J j for(k=0;k<=2*i;k++): M2 B& t" _' S( ~! t5 J5 S4 P4 m
printf("*");" K- K9 Z& z( `2 W V
printf("\n");1 L F/ A3 o7 Q! _% A- l5 z
}
; f( o6 k/ |% v: z* a$ h6 z7 D4 @for(i=0;i<=2;i++)
' Z" z& v3 k! [; A! a: | {
+ |3 s8 y( Y- V6 A for(j=0;j<=i;j++)
6 ]7 j. o7 R6 a! | printf(" ");
e, l$ I( [ h4 m for(k=0;k<=4-2*i;k++)
# H- d" @6 |' g" K; H) v printf("*");2 h; ?, V( u5 Y8 Q7 r
printf("\n");
" o3 T- i" G' w- [) s/ `! {% m2 f }
" ~6 q7 l) X; R! D: u' V}% r3 z9 K" {2 l, R
==============================================================
' d1 X7 e' I4 W ]【程序24】 ) R$ J9 v& I1 s, b. {
題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。 U& C. }% m/ Y- q, W0 B
1.程序分析:請抓住分子與分母的變化規律。
! ~- N! q* \7 _, x& y2.程序源代碼:( Z" k/ s# l/ z- k8 Z0 K6 b
main()7 e# V) r, w$ U2 }1 f
{
& A$ J( a/ b4 q3 Dint n,t,number=20;% R n0 L3 K; _) s
float a=2,b=1,s=0;
+ ?, J, ~- P1 y! `* a7 g6 H; yfor(n=1;n<=number;n++)
) i2 U5 k1 C) n( ^$ z {
* f x* f9 F/ d s=s+a/b;) q2 v: O5 g. X3 l' N/ _
t=a;a=a+b;b=t;/*這部分是程序的關鍵,請讀者猜猜t的作用*/6 d/ i& [; e" c$ A" s
}
) T0 R% T# E7 @* @0 O1 Oprintf("sum is %9.6f\n",s);
1 C4 r. V3 u7 l- w}4 g6 L5 D5 l$ j; F# D( H8 e8 e
==============================================================/ Z4 P. R9 D" q1 ?6 T3 T2 U- w
【程序25】 嵌入式學習企鵝要妖氣嗚嗚吧久零就要* O# M H& [4 a7 B
題目:求1+2!+3!+...+20!的和+ k( i7 o r* n; E8 L; ^
1.程序分析:此程序只是把累加變成了累乘。
, z) R2 Q3 K- _# c' W+ O6 ~) k+ `: d2.程序源代碼:5 F6 G8 [0 V @4 n, K# N5 j
main()1 {' q! a. J& X0 g: L# O" J5 w. T: ^
{
, ^, q( A0 T% g9 d+ i2 h/ Zfloat n,s=0,t=1;' Z$ Q1 G1 v1 M* \1 O
for(n=1;n<=20;n++)2 P: L9 H$ a. u u0 B) Q- D
{2 g2 z" d# X0 t v6 \4 }
t*=n; e2 _6 J! Q# W
s+=t;* F4 O# _9 u1 s
}
- L' J! A1 s9 \7 d {, b r1 ~ Bprintf("1+2!+3!...+20!=%e\n",s);" ~5 x/ r9 g' \" ^- M2 K6 k7 R3 a
}
( _0 n( X/ w; r0 ?. h0 ?==============================================================
! u' b1 q. H' s* K【程序26】
1 ?2 J. H# w- F, v/ C9 M題目:利用遞歸方法求5!。
8 M) a4 I- j/ _* h5 Z t1.程序分析:遞歸公式:fn=fn_1*4!; G0 N$ i7 ~ Z! {/ r
2.程序源代碼:% p+ g+ q- b* {9 r7 g# M1 x
#include "stdio.h"
/ ^1 g5 c' T w$ |main()
' `& `( T" t5 m# z/ U6 L{
0 e" D8 s# D1 A+ jint i;
( [% y% l, H D& [1 t6 u uint fact();7 \1 }9 n* z0 s# @
for(i=0;i<5;i++)
8 @: ?. f3 d2 L( D( _. x7 b printf("\40:%d!=%d\n",i,fact(i));: N& N* K* f) a! _
}
: g, @% C4 T; \. r9 Q! Oint fact(j): `: Z: I, w/ L( Y; E- P
int j;
- Q; O* Y1 E& S1 H{7 I. L3 ~4 h' [3 d1 f
int sum;+ [% j; I6 k( s4 c4 j: F' ]
if(j==0), y4 W3 M; f0 H% w5 m+ F% L) e. e
sum=1;' n4 Q7 F# f/ U$ w1 V4 J7 u+ ?' t
else
; E; Z+ `9 I# N6 s1 t2 [# T* W sum=j*fact(j-1);
/ d) Z4 X% @. _. B4 S* |return sum;
& Z4 T) z$ P/ K0 T3 I: u! Q4 Y}" w7 p3 _" |* B& f
============================================================== 8 k( W& s6 z4 b3 ~& r& J, N( ?
|