【程序16】 ; D; j% _6 J' V! \5 U7 Y; \
題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
$ e. l& |! W+ t4 W
% `' O2 h, m; a7 x% B/ X
9 O& J ?/ @" W; H; R& o- o3 B! z! [7 q2 V
作者: zhlei81 2005-1-22 11:30 回復此發言 3 d% N4 e* |4 b( Z( X
! H) N7 V* I+ s
-------------------------------------------------------------------------------- $ _; J O6 P* D
8 k; i1 x7 Z3 C& _- T- O, ~4 回復:經典C源程序100例 . Y$ j/ Y" o7 B2 ?7 n, u
1.程序分析:利用輾除法。 + ] d- _, o' M; P. h; a) c
, b, D- w( Q( R2 u2 O) I2.程序源代碼: & k5 Y, J) ~! |1 M' s5 J, d
main() 3 o: {+ M. B7 K! {9 G, M
{ : @: t" M; a# ~! i( s0 W6 P
int a,b,num1,num2,temp;
1 q+ m) p+ a! g* _. L- Vprintf("please input two numbers:\n"); , ~# P9 d( c' O6 ^6 Y" d- P" v
scanf("%d,%d",&num1,&num2);
( E6 L& v( P5 G. F3 \0 oif(num1 { temp=num1; " j( v+ b" w5 p
num1=num2;
+ [- k' \1 f" Cnum2=temp;
w$ U- g" X# j} / L) M9 Z7 }2 c& h
a=num1;b=num2; ) ?2 R& V4 l: o. |: k7 e
while(b!=0)/*利用輾除法,直到b為0為止*/ 5 s# R" L/ Y- f0 V" U! A" E, v, v" h
{
0 Z) O7 {1 c N3 o7 R0 Ktemp=a%b;
+ q8 P) Z- C7 Ca=b; 9 L4 K% J& z% v. G9 e8 h7 s5 ?
b=temp;
2 s4 U1 j4 K$ _% F( j}
/ o; q( R6 V3 j1 f) ~ r3 A" pprintf("gongyueshu:%d\n",a);
; ?% G: k! e, u6 t, g+ Iprintf("gongbeishu:%d\n",num1*num2/a); ; w+ U( n$ U; U
}
: f# Y8 [9 _' G0 r: c============================================================== " k1 N, B5 V/ F% r. Y9 q
【程序17】
/ r! Q; ~0 g& t; K題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。 . Z% `* k$ U0 y' Q
1.程序分析:利用while語句,條件為輸入的字符不為'\n'. ( G- s0 r* N0 C" Q3 K
- N* B& r6 U& x: T# }& m
2.程序源代碼:
) z+ k D+ z( R#include "stdio.h"
8 _4 F7 }9 t4 O. m# Tmain()
7 J0 a# Q8 e1 F, O+ z{char c;
0 [* i; ^" {; _0 E( qint letters=0,space=0,digit=0,others=0; 4 f4 a( m+ m' f/ c3 |# s. d& U
printf("please input some characters\n");
. y# d- y5 N' W8 R( P6 rwhile((c=getchar())!='\n') - e& ^7 _( e$ A, e" j: V) B8 i# |
{
) V9 f8 p! w s0 L; @2 A: Pif(c>='a'&&c<='z'||c>='A'&&c<='Z') 2 {7 Z& B4 q% @
letters++;
2 g ]5 \0 a& `# @8 O! x aelse if(c==' ') 6 X% W" B0 q2 _* X9 }8 n
space++; * A2 }9 v# B _5 }* P8 z, S5 r
else if(c>='0'&&c<='9') ' n7 J: k5 q- q% x9 V
digit++;
5 y9 o9 w. | k# ~4 ?else 2 y( \/ x9 T% G" k0 V
others++;
; N) c, k& e& n/ u5 t2 N}
8 h, m# ^) k* g( m7 sprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters, $ K% Y. J0 Q: f9 O! v! e
space,digit,others); 3 U( f8 s1 l5 J3 g2 R
}
( n; n8 J, a* ~; t4 N============================================================== % Y$ R* L: u, o" O
【程序18】
* }( M4 w# ]* w# q題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時 & Z [" S; w- d# e
共有5個數相加),幾個數相加有鍵盤控制。 5 h/ `" c- F) M8 O
1.程序分析:關鍵是計算出每一項的值。 % M3 x( z2 ~& {% j% u1 A
2.程序源代碼: - E) z+ c4 Y3 d7 I
main() # Z! I |8 f, [/ y5 |
{
9 `. [6 {6 Y4 w$ m b. d% A Eint a,n,count=1; 8 k" |* J6 Y% R5 c( C. O+ b% }) X
long int sn=0,tn=0;
* z2 b/ v2 W, h9 o, fprintf("please input a and n\n");
3 b( ]# ^7 L8 |: B b- ^' ]scanf("%d,%d",&a,&n); 3 e% v# C+ w: ?/ I" B
printf("a=%d,n=%d\n",a,n); 7 D( z/ V6 t1 C4 H$ Y4 {* C8 C, |
while(count<=n)
7 I6 W7 R7 J! k6 a7 x4 g; q{
8 F: ~4 C( y' O8 _+ Rtn=tn+a;
. D8 P1 W( P7 r" q& A9 Ysn=sn+tn;
0 A g# l0 M) \a=a*10;
2 |, u3 G! X+ J1 A& Q! i, r' Y++count; 1 F2 m7 c* U' @
} * E. r" [5 H3 z6 u" I; L. I
printf("a+aa+...=%ld\n",sn); , F) q. Q4 z0 c. I! ~* Z: ~
}
5 m9 o5 M- N5 c+ o! d==============================================================
1 N* l: S4 M% ^' \1 ^【程序19】
3 d& N: G! x) l! F# ~題目:一個數如果恰好等于它的因子之和,這個數就稱為“完數”。例如6=1+2+3.編程
; e% B0 k4 ^8 n, ]找出1000以內的所有完數。
# f8 l6 z4 j$ s+ ] ]3 @1. 程序分析:請參照程序<--上頁程序14. + a8 H5 @2 Q% G2 y6 _- Y6 p
2.程序源代碼:
5 U7 T. e. ]7 V# W9 Zmain()
. t5 {. I6 f# z5 I{ ~2 g" N. |. u& {5 Z+ W
static int k[10];
! S$ h0 e' n, h2 M& X# F" w" M' rint i,j,n,s;
; q X" H: w3 |6 {) Qfor(j=2;j<1000;j++) * N \) a/ c, a% m' N( o' I. o
{ 1 O) ^. ]3 F" V X: _# l2 j
n=-1; 2 \, r# |5 a3 U" @3 l; h
s=j; 5 M2 v3 I. k5 b( d& `% @& d
for(i=1;i {
& O7 X* |5 i/ U; \if((j%i)==0)
4 J$ t( s( R& n6 M4 J8 H{ n++; 5 m& E% x7 t( e/ \, e5 a
s=s-i;
. G9 Y. x" Z" r2 t& l# I3 Rk[n]=i; 1 j3 e& i5 d+ A8 h" D/ c
} , Q& N. C5 l. x4 f1 Q9 V/ A
} 6 q0 G$ L" q, j! M
if(s==0) 3 S! w) p0 T% ^1 ?& J: V
{ 6 c) H' M' A2 h- y' R% z2 H
printf("%d is a wanshu",j);
% A) L9 i& g# z% Bfor(i=0;i printf("%d,",k);
4 v: d/ B. A( u; Rprintf("%d\n",k[n]); ! W0 R# X- f9 |3 F% H1 J
}
" A, k; r# S, ?* b4 B} 7 K V. \3 r9 f9 K, H
} Y f0 I% u( t
============================================================== : u5 ~6 S/ c7 E5 Z5 E7 Y* s
【程序20】 " x, t* i* C. k$ [! f7 J8 g1 S5 N
題目:一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
, T | C! Z3 H2 \/ ^: S第10次落地時,共經過多少米?第10次反彈多高? ; }0 l* k' p9 j- z* C
1.程序分析:見下面注釋 / L1 X& J5 y, @# m8 x
2.程序源代碼: : c$ R) L: r. a( S G$ `& W- Q
main() 2 r" ]4 j/ T. `' _/ b7 \) D" I
{
+ T1 e" N. {+ `0 M P( b0 Wfloat sn=100.0,hn=sn/2;
! Z. h6 w2 F2 G7 pint n; ' v% D. R, g/ P& T
for(n=2;n<=10;n++)
- A6 U6 ^; B; r( E$ l; o{ % I* ~, J% i/ ] N
sn=sn+2*hn;/*第n次落地時共經過的米數*/ & Y5 U3 Q% V; b3 a' W9 w
hn=hn/2; /*第n次反跳高度*/ % m6 a! @6 H7 v. N* r" d8 r2 ~
} + I0 }5 h) a5 Z& r, J
printf("the total of road is %f\n",sn); * b; T. O; X; ]
printf("the tenth is %f meter\n",hn); " L3 ~' `" j3 v
} 【程序21】 題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個
+ t. W0 N$ y9 D1 g3 C2 @8 w6 ?5 v1 w 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下
( P6 L' I6 c t# N# | 的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
' g4 x$ j) L) Y; p! `1.程序分析:采取逆向思維的方法,從后往前推斷。' b7 D) O) |8 B
2.程序源代碼:
2 ^* ^7 n" p, O( r U8 H5 Ymain()4 K; K$ R! h- Z; j, {4 S0 ?
{: U( s" A# F& n/ q5 {1 S
int day,x1,x2;
9 P# @, r6 e' p! o! q/ aday=9;
; W' n8 {: K# kx2=1;
7 J5 R8 n' o: b8 s: f. L2 gwhile(day>0)# S: E9 W7 A, I' h
{x1=(x2+1)*2;/*第一天的桃子數是第2天桃子數加1后的2倍*/) x5 q+ ]. L4 @) O
x2=x1;3 P0 O+ k p7 @( p( \
day--;
: E& }1 W0 z1 p: ^) u1 _ }; S# ^$ D; N* k+ T! {- N5 @
printf("the total is %d\n",x1);
' f+ z& o* C9 @! _}$ B* Z0 w% s8 z9 |1 e a$ C* E
==============================================================& S2 W4 {6 f4 q' Y
【程序22】
; w9 F0 o/ C3 x" g8 w6 s3 C- [' k9 l題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定# y+ N$ }9 d8 ]) i
比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出9 T) d. \2 Q* Z" I% }8 g
三隊賽手的名單。 ! I0 n3 O% l7 F# ^% R5 m1 _1 I
1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,& Z9 q. W4 D3 J0 ]6 c
則表明此數不是素數,反之是素數。 9 e3 N) s# O) {- b$ T
2.程序源代碼:; P8 V3 B# _+ b( ]
main()# _* g$ L }) L* w" _
{
( m- {( Q1 {0 B* }, t( Fchar i,j,k;/*i是a的對手,j是b的對手,k是c的對手*/
1 v9 z& _: `) wfor(i='x';i<='z';i++)
$ a) E1 ^7 H7 B# b- j8 H7 M) r6 o: H for(j='x';j<='z';j++)+ d6 M. N- g6 C [1 E
{
: F( b+ G1 q1 B7 g# Z if(i!=j)
& k) a, H: p5 p( [0 j- n for(k='x';k<='z';k++)
# w; O6 y& [9 ~ { if(i!=k&&j!=k)
6 X% d* z( X$ L% ]% b" m/ ? { if(i!='x'&&k!='x'&&k!='z')
- K! Y$ P5 ?- f% y printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
4 {8 [. y+ n, H }) _* \5 H5 e) b& o; ~/ z9 L7 `
}0 o6 A, f/ q# B; @/ n' G
}$ e, h0 h9 C3 D9 c$ o. ^
}2 P$ o5 Y$ Z, A+ h7 h
==============================================================/ U$ K4 Y8 G- C# V
【程序23】
2 J( v2 b% v* y7 A2 F題目:打印出如下圖案(菱形) *
( D* ]" V! d; P' U; j6 D***
$ |& c F$ Q d******4 g, T& {; ^1 `' o _ \6 I* v6 _3 r
********
- d8 ]3 ?; G- z! x2 q% ^; z9 j" v******$ T# B* l' d' S4 ^7 {
***
2 A- |- ]. j- v' D# u" p p*
4 @0 J1 D* L* h" m- {0 v% x1.程序分析:先把圖形分成兩部分來看待,前四行一個規律,后三行一個規律,利用雙重% ]. K5 U+ [1 h y6 }
for循環,第一層控制行,第二層控制列。
$ c; _2 z5 M( X# Q) l" J! c2.程序源代碼:0 m8 b& x; c% W) P
main()! w: e6 C% u# m8 g: o5 o7 I. y
{
5 T9 n/ p" b! N3 j) r4 c1 m$ O- mint i,j,k;" R( c$ D# @- \4 L5 y3 _* f1 z
for(i=0;i<=3;i++)/ [ J! J3 P5 S
{
$ t+ v, \/ ^1 L9 z+ }; u' W for(j=0;j<=2-i;j++)4 Y2 W5 C3 I' a0 ~3 q( N
printf(" ");# C* h4 W R% m: r4 G& ^
for(k=0;k<=2*i;k++)
" h' f5 r$ \$ [5 X7 }& A6 {0 ^; o printf("*");8 P; D* J+ f2 r0 @
printf("\n");2 ?4 l; M+ }1 ~' K0 h6 w( L
}
x0 H3 k3 h& _0 {( f+ F/ p! Ifor(i=0;i<=2;i++)
, l4 h4 S2 ~3 R) c/ @& K7 u& o {3 x# {6 r6 z" w& g- n' M
for(j=0;j<=i;j++)
3 Y+ b; g* S6 `% y: s printf(" ");
# {# c; M6 a2 }3 C+ O \( n. J for(k=0;k<=4-2*i;k++)
. e5 v7 M. M4 ?, i) ~3 Z4 c printf("*");
! t1 m) x# V$ n printf("\n");
5 E: z! E# ~ k9 v0 s* b" { }
2 G2 v: W8 v2 J}% M& {' H3 c" r9 t7 _& Z, R
==============================================================
2 S: _/ z1 h( n9 ~# {( ^3 D7 a【程序24】
" Z% O- f; b2 C# A W題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
) v4 O1 {2 L$ z" R+ g, l" x- V" C* o1.程序分析:請抓住分子與分母的變化規律。
# _" Q3 [- t# P2.程序源代碼:
0 N+ W" n' U2 x2 {( G* @5 Nmain()' i3 {' V6 a% ~3 P, ^/ ?
{' V0 W$ P0 j; \& E3 X; O$ ]/ p
int n,t,number=20;
$ W5 ~: Z& v/ z% P/ b0 Q. k7 rfloat a=2,b=1,s=0;/ T0 ?- [9 k. Y i! P" d
for(n=1;n<=number;n++)9 A9 t" |0 V2 t' \( J' M
{9 X$ K( X2 y3 E# G2 f9 k. ]
s=s+a/b;
2 k2 K, z" J, r2 u7 e1 @) ~8 _ t=a;a=a+b;b=t;/*這部分是程序的關鍵,請讀者猜猜t的作用*/
; l$ m- d% n; U1 X0 ~" k }8 r; {8 q9 b+ w/ _
printf("sum is %9.6f\n",s);
4 ?4 I4 R b# ^% D' r6 H}6 L0 a& W* T( a9 C }
==============================================================
( x) n0 J: B K1 n【程序25】 嵌入式學習企鵝要妖氣嗚嗚吧久零就要7 a1 Z6 z' a# L! }$ X# v/ [; }& v
題目:求1+2!+3!+...+20!的和7 E( N! _+ x0 d
1.程序分析:此程序只是把累加變成了累乘。
# b; g0 k' }8 ]8 r5 }9 |1 {2.程序源代碼:
6 R! b2 k: G! @, T: `8 cmain()3 u% r) P# _& E1 ?, n* _, J1 y3 Z3 C; g6 F
{
5 |0 Y Z0 O R5 Ifloat n,s=0,t=1;' |: z- C4 j0 B! W' ~8 X/ N
for(n=1;n<=20;n++)3 E: S4 H! g4 x$ [
{1 k6 o; n8 Z% `4 Z
t*=n;
5 ?8 J' ]$ A, K( h s+=t;
6 x. F6 n+ @! D% p/ X- T0 ? }
5 m5 E4 e- @4 `printf("1+2!+3!...+20!=%e\n",s);2 ^" b# c4 J2 J+ Z6 @+ y
}" Q5 O, W) o5 ?- b
==============================================================9 i- D j. Q/ K3 q) m2 O3 I& z
【程序26】
# y% j. R: Q* m6 S; F( B8 a7 S題目:利用遞歸方法求5!。
0 J. P) t5 q/ l+ ~# [1.程序分析:遞歸公式:fn=fn_1*4!
5 @: _. B: ]+ b% D) {, Q2.程序源代碼:, U' a& G5 G2 h, X( C
#include "stdio.h"
+ v/ \3 v4 U( `" Q$ Amain()2 U0 s F' v: O" j
{3 L& L# D. l* i7 T8 I7 N
int i;4 `# T- v9 [5 l$ V7 O
int fact();& e" d4 |" p; d
for(i=0;i<5;i++)
% O8 S) f; R% l printf("\40:%d!=%d\n",i,fact(i));
; V1 L4 j, W1 g* H8 R" ^}
. _: U6 P) U& K1 \int fact(j)8 C/ ~7 p8 ?- H, I$ M
int j;$ g8 ?0 S# C8 o/ r
{. ~6 {# g+ g2 F: W( e# [
int sum;
4 f# L) m2 s9 Yif(j==0) \: { f N* v0 Z
sum=1;8 _( X6 Z0 B: N" j4 h
else
, _% X% p) @( r' b3 G2 f sum=j*fact(j-1);& l0 P+ d9 d. _- q
return sum;* l4 ~3 A2 A! G4 H) n
}1 X. i/ H1 ?9 E( S
============================================================== 2 A! r+ B7 p- i* @; |1 s
|