【程序16】
' U) Q# `% z' j1 W% K4 t M X题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
2 ]$ q# E4 B4 H% _" a1 d8 D2 A, Q _4 y, v2 r2 b
) { ]* w6 N4 ~; F |$ k! F; d L
5 f: i6 w7 K9 J7 F( k0 u5 P作者: zhlei81 2005-1-22 11:30 回复此发言
- G# u& H; H$ p' N6 G' h/ Y) @- Q3 Q
--------------------------------------------------------------------------------
+ i: M( n3 s8 f7 d& t. x4 B9 N; j$ U+ @% q% K/ Q+ g# `5 y
4 回复:经典C源程序100例 % K/ V/ L. F$ A+ x y0 P' `( O- a2 T
1.程序分析:利用辗除法。 . ~# o* o2 T! D- z" x
+ T9 d/ Q1 U/ k+ H$ B2.程序源代码: & C+ @! W) d* I
main()
3 }/ L$ M0 h! I. o8 S' q' F{ 4 c& l" e& z p% N* G
int a,b,num1,num2,temp;
1 s- e3 U3 T2 [printf("please input two numbers:\n");
9 Q; }) ~8 p. Q& h3 T9 cscanf("%d,%d",&num1,&num2);
( f3 ?/ j! h* s! {if(num1 { temp=num1; 1 n0 R! `+ S6 R" q. f1 i
num1=num2;
7 p* e& C) f8 t l5 Unum2=temp; ) P$ F7 f2 ?% k% q
} , o$ y& w ^6 v$ _& t) V
a=num1;b=num2; ( C1 J0 k" M3 M5 P; J; t
while(b!=0)/*利用辗除法,直到b为0为止*/ : x4 o" X' V0 f" e$ ~
{
8 E# U4 [2 r3 X6 V2 Rtemp=a%b;
3 ]5 I: _9 h. _/ i+ r6 Ua=b;
; Y' q! p/ X/ _, {: A% f0 ^b=temp;
8 G: F; ~ y9 d0 x: X} 7 h- M. N6 j& \. ^5 I
printf("gongyueshu:%d\n",a); ( Q" {& p$ H% w7 M5 ?- j
printf("gongbeishu:%d\n",num1*num2/a);
! k1 u7 U. e5 e" C4 G}
$ Q. h X3 \# K: l; k4 H============================================================== # E; v1 n( C! ~# n- n0 _! v
【程序17】 5 `' i! Y' V1 V F
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
& U! I f- _4 D0 y" W! Q% y" a1.程序分析:利用while语句,条件为输入的字符不为'\n'.
9 V) P. \- t7 r5 {( o1 v5 _* V
) ^% ?6 A2 j( p) t7 D2.程序源代码: 6 g0 s/ J) F B3 i! d
#include "stdio.h" 0 W0 O" }* ^9 z0 a* |- n. n
main() 6 @5 ^; U; l1 k4 J% N8 E+ e: S+ n
{char c;
+ u' I/ U- k- P# G+ oint letters=0,space=0,digit=0,others=0; - p8 _8 T0 j; P e% _
printf("please input some characters\n"); 7 w3 f2 Q. s5 R5 f4 S* Q
while((c=getchar())!='\n') 5 _. S+ z1 w) F: a7 v+ F. {0 u
{
8 F7 H% ~# f9 f) Cif(c>='a'&&c<='z'||c>='A'&&c<='Z')
* K a- q4 x. b' p+ Hletters++;
8 c# ^* g( E* g3 [! ]: yelse if(c==' ')
& S. c- b* C) K& a; Ospace++; 2 b9 J" N* ~. F' J# L8 Y
else if(c>='0'&&c<='9') 8 w& _( p; z5 W1 c U
digit++;
8 M+ J( M8 K; Uelse # n. Z6 z' L0 o# D/ j" B. t$ ?9 ]
others++;
c7 X, }6 M5 q& {}
' u/ [' s3 V$ cprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 5 d3 z3 n, b. q1 H, D
space,digit,others); / Q/ A, Z1 ?8 m
}
+ W/ V T" g/ e0 f4 c# F==============================================================
2 j8 M |0 E0 K/ f& ?$ s) L【程序18】 8 t; d' C+ V$ X9 g& H
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
3 `+ P$ |! S" t共有5个数相加),几个数相加有键盘控制。 0 p# L0 \: o. Y% t# O/ V$ m; l
1.程序分析:关键是计算出每一项的值。
1 p5 M4 K6 f7 w& B2.程序源代码:
& }7 A8 w4 a2 G& Emain() 9 i' |( M4 L4 G) S2 p6 Q2 ?1 q
{ 0 e! O* a U& S$ k: t
int a,n,count=1;
_& b" w8 p% F/ U: J! h/ T% llong int sn=0,tn=0; ( W4 E, O8 f1 G4 F. [) s3 r( p
printf("please input a and n\n"); ( L* b0 i3 f- v6 W/ ^# y: ?
scanf("%d,%d",&a,&n);
6 e9 F" C" K: l, u4 t1 Y; sprintf("a=%d,n=%d\n",a,n); $ b% \# a; [) @; S
while(count<=n)
& y/ p+ O |$ `! m! F5 ^% {{
* Y8 k9 y& K2 Z0 @; P0 e* x" }tn=tn+a;
0 e' ]; Z4 h2 U, B0 J1 X8 e: F+ csn=sn+tn;
+ s( y- B- `0 m0 @4 E j1 \4 sa=a*10; 1 P0 |9 O6 Q, P8 p$ W
++count;
: B" R( O; V; i} , Y; ~1 C# b( c0 C) d# F
printf("a+aa+...=%ld\n",sn); $ f' h8 @7 k" c8 g; S8 i) g
}
, B/ F" X+ }! k0 q# O' c==============================================================
2 z# F7 @% q0 e1 {- q2 m【程序19】 0 a& ^+ ~: o4 I9 `; ^* ~( }! `$ ~
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 9 y) Q& [ c- V; x+ d
找出1000以内的所有完数。 & ~4 T3 x0 {; s- Q ]
1. 程序分析:请参照程序<--上页程序14. 8 t& B# C. p# P+ i
2.程序源代码:
! h6 v; Z) H: K, e, omain() , V9 r. M9 y/ x- e5 l
{
; M9 D, l9 w$ V/ [static int k[10];
: u* w, P5 I: `! [int i,j,n,s; 0 X# D% Y0 i& P5 e( D& L6 j! C- H
for(j=2;j<1000;j++)
1 i2 Y7 j) W5 a; V$ ]6 k1 P{ 0 k$ f; Q; J+ [& B0 `8 x
n=-1;
+ U' d& F J. @( O8 hs=j;
! m) O1 u* E Z$ f6 F6 X! c+ Sfor(i=1;i {
8 @# z/ h# P, r5 p( @0 Y. ]if((j%i)==0) 7 U; {; B( \4 }2 U( G
{ n++;
! E# ?9 h" K& q: Q! B! z: g2 _s=s-i;
& r- ^# S6 B# Y( l( b* H; t$ c9 Wk[n]=i;
3 H- J6 F6 G5 g1 ]}
0 W0 E, W; l1 w: z} 7 g7 U- C5 L) g9 s
if(s==0) 1 E7 w* v: ]( I" u- I, z4 X! X
{ , W% C f7 l( d4 d
printf("%d is a wanshu",j); ( P+ K% _: Z1 U9 X- ?
for(i=0;i printf("%d,",k); & e' O5 ^5 J" n+ d9 T+ {. M1 C. @1 T
printf("%d\n",k[n]);
8 z( h* T U/ b' }4 Z/ L, b} , x0 O. w- p* c
}
6 R' M$ X2 C& N2 f3 E# m}
% k! G) D3 t2 `$ @; I: N============================================================== 5 Y' G( p, X4 ~ x
【程序20】 " z/ v5 E4 y! }
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
7 D2 r, x. \6 t- J; F$ k第10次落地时,共经过多少米?第10次反弹多高?
1 J+ t% `0 {8 [% ~ Z. M1.程序分析:见下面注释 A& g- E& ^& ]
2.程序源代码:
' v' C% v- ~, }: x% Vmain() % U* q) m! o c; q+ ]8 w
{
4 j) e- i7 ^) Nfloat sn=100.0,hn=sn/2; & X5 R1 g; Z% O
int n;
+ R# q' u) k* Mfor(n=2;n<=10;n++) . _9 [3 _2 C! p% R; m
{
, A' e* ?/ o5 r9 r8 k" h. h* D1 ksn=sn+2*hn;/*第n次落地时共经过的米数*/ 1 P- @' b6 w$ @" L6 [
hn=hn/2; /*第n次反跳高度*/
" ]9 f; `0 A, \8 A2 P) U0 W+ l}
5 `% C M b* a" [9 }printf("the total of road is %f\n",sn); ) g! S' S' W, D) @ S0 Y8 ?
printf("the tenth is %f meter\n",hn); , |5 h1 Y* h. I
} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
# M7 V8 {) c; U+ @ 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
8 N/ C2 L/ u2 Y/ b7 S) g% v4 W' H- u 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。% X) ^- t$ V9 Q& V! ]/ Q1 F) j
1.程序分析:采取逆向思维的方法,从后往前推断。( Y. m% E* v. K0 _2 y
2.程序源代码:
7 o& R7 T5 ]* W- h4 vmain()
5 h7 H1 o8 N5 _4 G( D( ]3 d# R{
' U+ z( z' [5 Q) ^4 [int day,x1,x2;" j$ y, z( }' Q0 F* E
day=9;5 i7 ?6 @! h0 K7 [
x2=1;5 v4 R% @! E0 }0 ~* c' C3 v
while(day>0)! v9 V: X& x+ [
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
3 u6 `, X$ a2 ^5 m x2=x1;
$ z6 m: O. B, W3 d9 V day--;4 ~/ ]/ Z1 P: E! `5 F W8 f
}
1 s% I4 I0 b7 \9 |; Zprintf("the total is %d\n",x1);
0 n9 m$ V4 n8 ]- X2 R! Q}* j6 b4 \( s! I9 X5 v! j
==============================================================, @+ z) W6 J5 S
【程序22】
! Q3 I2 p9 h" x a题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
# C1 \1 ^0 V+ O! Y 比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
- J( Y. Z# E$ e! l, ~. E/ J) e 三队赛手的名单。 5 \) f4 {% a x; n3 @1 W' f. O, _( L) K
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,% S4 b3 O& @9 w6 L) i
则表明此数不是素数,反之是素数。
0 s8 |$ U+ i- _6 Q+ g, F2.程序源代码:
: o4 {' ^+ G/ F- v' zmain()
2 |& d* f2 X2 ^5 s" k9 A2 z{) y1 L# U, j& y7 t" \9 m$ H
char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/1 Z5 P4 }! ~$ P3 T& s- @) x
for(i='x';i<='z';i++)
3 d9 q; J: R& R9 ~- N5 x for(j='x';j<='z';j++)3 l7 N8 \3 a* T, b4 {
{: a+ y& K/ m# l _
if(i!=j)
( P' ~* S7 z9 B4 V+ A for(k='x';k<='z';k++)
' I+ [" t y, W$ K( | { if(i!=k&&j!=k)' C$ D$ W! G5 Q8 v9 U4 d9 r0 h
{ if(i!='x'&&k!='x'&&k!='z')6 ^9 c9 R- r$ W7 |. h( c
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);' s( w$ Z' R. q. X! B. \; g+ ~
}/ g7 p3 q0 W4 Y7 D- x; e) A: m1 ~+ ~# `
}, ^7 e. O) G9 ?/ |- J- ?
}+ U" G6 {6 j& u" R( k0 j" g
}/ h) P5 r1 Z. p0 ~ G/ t6 m
==============================================================( c d( d4 D, n$ ^( k2 R
【程序23】 " a/ Q4 X( o2 W
题目:打印出如下图案(菱形) *) E" \# k1 s7 o$ e( r
***9 W1 B# H2 E5 P
******
, _5 A/ q( h$ Q********
5 V3 m3 m0 s6 e0 I4 @& ?, E******
1 d2 @& w& A' s2 @! D. ?" v***2 Q$ b* m7 @' O$ e% I' U
*
6 _# ^; M2 B" K1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 M; |5 d' H2 W8 ?; g0 `, l3 N
for循环,第一层控制行,第二层控制列。
* ^4 d% d& c/ M* n; K r; U2.程序源代码:
# O) o+ L# P! x# G) U; `main(), o# n2 p @! A0 N
{
, U3 G5 D8 C" p; C2 p. yint i,j,k;" B* J9 c6 y/ \" D
for(i=0;i<=3;i++)
, H( \' Z: M3 R$ P0 c. `% j {
8 h ?7 P$ p$ H; @, ?8 Q2 S for(j=0;j<=2-i;j++)
2 e- Q+ P7 ]1 v7 W8 x6 Y. S printf(" ");
0 }0 X+ o3 n) K$ k6 f( | for(k=0;k<=2*i;k++)
) F% i, j$ {4 M printf("*");
- y; l! m: h6 w( u6 |; E printf("\n");! T! S" o c9 g$ T; n5 B
}9 E3 Q/ M/ [' I/ h* h6 s
for(i=0;i<=2;i++)
l& {3 d6 q) |0 p1 V, m9 d {, Q& B5 R. C+ d# X
for(j=0;j<=i;j++)# X' v/ P2 F4 A' N; U) X
printf(" ");
! i3 E% W8 q0 {6 p7 M6 _% I& u for(k=0;k<=4-2*i;k++)9 H! ~1 S+ `- @* Z
printf("*");; M& q2 [7 K) C. f3 d. ^
printf("\n");: N2 V* E0 h: m+ K- w; K
}4 H, v( q/ T, M D w* M+ Z
}
: a9 ]4 ?9 J4 ]5 u; S==============================================================( R! S( V" y4 {- e4 p7 k% r" b
【程序24】 9 ^+ X% @' v4 l% k, E- g* V
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 U; C$ ~- e( _% `( ^* d4 C
1.程序分析:请抓住分子与分母的变化规律。 , X; T! G4 M* A2 r7 S1 ~
2.程序源代码:. Y! i1 M; C/ l/ ^6 m2 f2 D. n
main()
4 U" Q: o& ~+ F' j{
3 ~( o5 ]; P6 o" I; T% A7 iint n,t,number=20;
- u8 ^# P7 }, |5 yfloat a=2,b=1,s=0;
' z2 \+ e* w# Q# p( W; p" xfor(n=1;n<=number;n++)0 `; g* ?0 i1 j
{
2 u: y# X! _ [) W7 ?0 o, x( i- H8 w s=s+a/b;
- e/ _4 S2 k3 T t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/. A! G( n& ^6 l0 i! p: _ `6 N8 G
}/ x$ \) ?% x$ V2 j: J# n
printf("sum is %9.6f\n",s);1 }1 \, H/ s- M: V1 e) Z0 @
}
5 b% Y# r, B; b9 x5 k: _==============================================================
0 b, W) K% v) T- O【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要! B) e+ |" ?# @7 K" ^
题目:求1+2!+3!+...+20!的和
8 T2 L: `; \- k* K5 {1.程序分析:此程序只是把累加变成了累乘。 9 a* Q* N# [4 p& D
2.程序源代码:
) J# E2 c" b: J- @4 g6 I1 ?/ r% ymain()
$ C& {" D9 R3 g3 R0 Z5 H{
' z! j7 l7 }. w! P$ u0 `float n,s=0,t=1;
/ ]$ }/ d) n" b5 y$ mfor(n=1;n<=20;n++)
4 Q G7 Q& j& J! t, n+ y2 ] {
7 Z- O0 Z# f- { t*=n;$ @, o; g# b, ]3 h5 B8 G
s+=t;
% W7 ]0 Q( ~ P: K$ D6 O& G+ E }
1 J9 F' I& R# O( N1 Vprintf("1+2!+3!...+20!=%e\n",s);% U( @: D! X+ d! l- n& F
}
\/ N& D8 P+ n1 q; ~============================================================== c0 j6 U2 h% ^
【程序26】 3 _1 j" R5 F; r6 h5 r
题目:利用递归方法求5!。
/ I6 G8 n' u) i0 c1.程序分析:递归公式:fn=fn_1*4!
# V1 @( ~# R0 n7 K, |# @2 x2.程序源代码:
9 P3 `# B0 ?0 x+ f; x) C' t#include "stdio.h"7 p" S# z( U0 u9 v1 s
main()- X" j) K/ N* n, o
{, T% B6 @' i) q
int i;) |' X. {& o) t6 J- U( \+ d
int fact();
% {6 M S# c( q. I% N+ l$ L3 V4 Ufor(i=0;i<5;i++)
3 N1 g& c; C6 Q; q" F% P printf("\40:%d!=%d\n",i,fact(i));
! @! G6 E$ c( h* U c}! ~; `+ _0 u. U0 K8 I! i
int fact(j)- ~7 t9 v. T5 c2 z1 t9 I
int j;
1 p$ @- y: G& J. i- q$ j{9 V, q& i4 Z" @0 g. E g* T
int sum;
! ]2 \& R3 q' Yif(j==0)
* o8 ~* j% c c3 I sum=1;
8 P0 K4 P- l) R7 o7 T, H" f# Jelse# D+ h0 r9 _$ N; N4 i- W
sum=j*fact(j-1);- Z1 }4 H1 j+ ?# O* \2 X
return sum;
5 O% Z, A I( R$ F" N$ i}
/ g5 a) \, e' n2 ]( t, ?4 \- c- ?; p9 g============================================================== 5 H( p# Z4 P6 t' v4 l
|