【程序16】 7 k, `! y2 U6 s4 U( ?2 j5 [1 I2 O2 q
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 ' |( g9 m4 E! R/ D: O
; B0 K3 g3 a4 f: u/ ?. {7 t! l
/ V( j- z7 H9 j! E
9 u# j" B+ n! U作者: zhlei81 2005-1-22 11:30 回复此发言
$ A$ ?9 e l* G3 D, p, i% i% K. H& Y5 F& s$ w2 b( T
-------------------------------------------------------------------------------- 6 J: n& F* M. F. l" D
6 o2 ?3 }3 f) m" z8 p! A" K; n7 Q4 回复:经典C源程序100例 8 F8 |1 r/ m7 l( t; d+ d+ W" p
1.程序分析:利用辗除法。
3 d& H# S& n/ ^, ^9 r" A6 ]; S/ _4 s1 G
2.程序源代码: r" ]5 H6 H' E! l. o
main() ' Y' v. R1 E. f$ t x
{ - c8 g$ |( ~0 s/ e- Z0 o
int a,b,num1,num2,temp; % B2 v; P9 |; c+ T2 M L' D
printf("please input two numbers:\n"); , y( X- M! J6 p# V8 x. z
scanf("%d,%d",&num1,&num2); 9 G7 n1 `$ m! w3 R
if(num1 { temp=num1;
9 J' p. g i7 g8 f1 U$ i! }num1=num2;
N0 O5 i0 n' R& _' ]num2=temp;
6 t" T6 y6 ~6 ]# s/ A( t}
; Y% A9 [2 P2 ?7 S# L6 Q* N! P+ K5 ~a=num1;b=num2; . ?5 ^' [4 P9 z* |3 ^! S. O
while(b!=0)/*利用辗除法,直到b为0为止*/ 8 s, A; P( @9 F. q I1 ~
{ ^! d/ b1 D2 r* h0 f
temp=a%b;
; T9 F! X/ U- V; X) Oa=b; # v) y$ M! I" t9 Q
b=temp; ( m, c* p8 t: I; i
} ; ~. V0 k, E" C
printf("gongyueshu:%d\n",a); # e6 v+ U; G& j) Q' H
printf("gongbeishu:%d\n",num1*num2/a);
+ D0 i$ e) g3 T3 K+ t1 I' G, }6 n} ' H0 f3 ^' u+ C7 U
==============================================================
Y/ |9 Y b& R% D" K/ c2 p【程序17】
) V$ g0 {, k& a题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
) \) |+ s, p2 d. V+ @1.程序分析:利用while语句,条件为输入的字符不为'\n'. 3 h' B# \3 Y# H; ~, K& e8 m
. c, A5 v) z$ z0 c0 ~2 `6 a- c2.程序源代码: / {# G& q* b$ @- L8 {
#include "stdio.h" 7 X; U, f" \. {( K$ I
main()
9 g, d. w" s! H. }' ]3 @2 F{char c;
" w# \7 B5 z0 ?3 R* c+ Kint letters=0,space=0,digit=0,others=0;
+ w; O% \6 c Q- q1 z7 l2 yprintf("please input some characters\n");
( S. ^2 o+ b. q% nwhile((c=getchar())!='\n') 0 ]5 U$ ^! G8 I- @
{ % w9 E9 W" D5 ~6 c a' S
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
0 Q1 {3 i$ W X4 F2 O" t/ xletters++; $ Q" _$ z" w5 D( _
else if(c==' ') 1 B3 g+ _8 D/ L G
space++;
$ i' d7 h' Q' N7 h1 D$ t2 }else if(c>='0'&&c<='9') 5 }" a- t0 v. f+ R+ ~: u
digit++; I7 |+ t% G E, w* ^
else " a2 p( h( T( i# v2 Y
others++;
+ N4 g7 J4 H! K' c `. l" V} , u8 x8 I' r2 ~, a, V
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, . p. W% w9 k$ }! i
space,digit,others); 5 B- g# G9 J+ |2 t" a
} / L' @8 ] C3 X$ \# L( G
==============================================================
8 \7 X7 ^# m' m【程序18】 5 G1 P# K- A: O1 M( ], {/ V$ @
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
# \, `& l2 w0 ]" ]共有5个数相加),几个数相加有键盘控制。
( F6 G, `- `8 W1.程序分析:关键是计算出每一项的值。
) h0 n+ A9 a/ p) @- ]2.程序源代码:
8 N3 v/ o, C. \# S1 l: pmain()
& E4 F# l5 `& l8 ~/ h# j{
) z2 p1 ~1 w; S3 p$ ^8 Iint a,n,count=1; 8 }7 G" \$ T7 d& o
long int sn=0,tn=0;
8 D& _& y1 a: {- F! ~+ ^printf("please input a and n\n"); 6 g" S/ Y2 O* ?) N$ z9 F% I/ B# _
scanf("%d,%d",&a,&n); " N3 e0 @5 D% G; m* s% N
printf("a=%d,n=%d\n",a,n);
8 d. m, h1 t% Nwhile(count<=n) # m- `+ ~7 |! D T- w! x. q% S& b* M
{ - g* I2 n7 X1 m5 j+ W, w6 c
tn=tn+a; ! B ]4 I4 z" I3 |2 ^; O2 P" b; j
sn=sn+tn;
' Z# p2 k' V! X `a=a*10;
0 O. M3 ~( G! x8 `++count;
9 m) b6 [4 j7 o: p7 \1 j- P} 8 n, B9 p8 P# k( U1 x2 m
printf("a+aa+...=%ld\n",sn); 4 h- m6 a; B* x) `5 Y
} : c: e Q) C5 b. x; Z
============================================================== 7 i2 G; V5 c" f, ~5 s& G- x8 ~
【程序19】 + F, m; s! J m T
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 g2 o; ^$ v' y% T' b
找出1000以内的所有完数。
2 g1 L3 Y. {' t, J) Y4 s1. 程序分析:请参照程序<--上页程序14.
6 L {; C* P) _! t7 d$ `; P7 {2.程序源代码:
" P5 z% [& ~ c6 {0 C! Omain()
$ ?' p- i& ]. a6 m( g3 f, L8 O{ n. i6 y9 Y- b) L& r5 R5 d# p% X
static int k[10]; + t) [, A2 P' W$ \# }$ _7 X4 u, P
int i,j,n,s;
2 ?) i* D* g9 {for(j=2;j<1000;j++) % w- h( t6 t8 _
{
3 ]- v' o1 g. P& ~6 F$ N0 x, ^n=-1;
% F. v9 G2 d b. S7 n/ _! ]. Js=j; 9 z! ^+ t! J6 C# N4 e @ C7 Q
for(i=1;i { * N% x, J! G1 G% t5 _9 x
if((j%i)==0)
8 S c3 Q6 N3 {- Z) _: A/ [{ n++;
3 U; L. s# w$ G; Q, w! ]s=s-i; 9 [! i+ z4 h8 t
k[n]=i;
& I( f W* u4 @( Z0 H}
! u9 k; Z) D. F- f \9 I} 0 a4 z7 D7 K3 Q7 r" a0 [; v
if(s==0)
- X. m$ b, L6 e{ 8 Y! @9 H: o' [$ Y s/ N! H
printf("%d is a wanshu",j); ' j H- i% ^5 r) z. j( Z
for(i=0;i printf("%d,",k); 9 \; ~9 P0 }$ ^4 m4 B
printf("%d\n",k[n]);
, D+ R# S- L, p} - `4 j- p6 |4 K" ?9 i- I# R
}
; r! o" T. x! t- t* D0 s} $ n2 s/ v0 @6 N) B# J
==============================================================
/ _% G$ h4 O3 ?' W8 R4 R【程序20】
$ ?+ w3 Q, w9 w' S' @题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 ! s+ n/ |/ Q) }
第10次落地时,共经过多少米?第10次反弹多高?
+ t1 {" z/ u' p" {/ M1.程序分析:见下面注释
% `& K: v( k" O7 i, S( f2.程序源代码: 7 X+ z6 q Z5 B; ?8 [5 Y0 q3 Q1 `
main() + ^! ~$ W1 P% t8 U' N! P
{
: l$ l9 v- S3 m) j% o0 {float sn=100.0,hn=sn/2;
: @% ]$ H" D) bint n; ' ?) U. L: Z+ D% n& D6 t' _- r
for(n=2;n<=10;n++) / C3 x! n* W& d3 v. G
{ # r/ g. L3 P/ [" h/ T3 s0 @9 U
sn=sn+2*hn;/*第n次落地时共经过的米数*/
. L- r& W, F: o K! Thn=hn/2; /*第n次反跳高度*/
0 J6 l8 p$ B6 \2 \' K}
, i5 I$ g% X& R+ B2 Uprintf("the total of road is %f\n",sn); $ L7 a4 E' }, D; ^1 c
printf("the tenth is %f meter\n",hn);
7 W0 M) F2 d0 G} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
, ^% A7 P F/ f7 l: u2 J0 G5 E- _ 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
% D5 ^6 E1 a- {8 _ 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 w; s8 j( D, y5 r
1.程序分析:采取逆向思维的方法,从后往前推断。
- \! `* {, F% X; M- L7 \2.程序源代码:
- }" X, |. c9 Tmain()
. Q' w: y$ y/ s# C( Z8 h1 C{; b2 {+ _( d. e1 |3 X/ u$ n
int day,x1,x2;0 h& x/ M0 X4 C8 @+ A, ~
day=9;
[1 m3 ]0 d5 L2 Px2=1;7 K0 w" E* W( X' a2 o7 n) ~1 y5 E& s
while(day>0)
/ Z T9 I/ o& [6 L8 ~9 u* M {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
) w5 v$ y) U/ l1 z' s. o+ o# X! c x2=x1;
; q4 a( B2 z, \$ G* |( M! U day--;. i5 g$ M: D6 a6 R/ v
}1 b2 n0 A$ E# v3 x
printf("the total is %d\n",x1);
. A0 L+ ?- z [' q}
/ h% U& H8 H7 ^2 u==============================================================
& B; P6 v4 S% R& X8 H6 m# X5 k; s【程序22】
9 N" f( ?/ g7 Q题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定" S! T/ [5 t. G4 F4 Q4 R
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
8 u& ~# M3 B- G- n" k2 \ 三队赛手的名单。 2 ]4 n# }; E9 l0 I, [. t2 `
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,; q! Z2 q9 v4 I
则表明此数不是素数,反之是素数。
: |9 d) F6 Y% j4 e b2.程序源代码:7 A; B7 T2 @3 {
main()8 D, Y' Q! C$ v- E, c/ Q
{& |; |- |, {* `: m& ~
char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/9 j8 b; i4 R* `* W
for(i='x';i<='z';i++)
; X& R3 M+ ~7 M for(j='x';j<='z';j++)- _8 o; V+ x" x. I
{% P M) r0 ^7 I- f; N% I
if(i!=j)6 V1 X3 w& v( ~, m$ h
for(k='x';k<='z';k++)
6 \- v9 N0 Y3 o5 \; g' d! m# [ { if(i!=k&&j!=k)) {3 j$ f$ M7 I u
{ if(i!='x'&&k!='x'&&k!='z')
* J J1 Z8 @" O7 j printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
6 L- L- f. F A% J$ ^9 } }
5 }; F1 D( e8 }/ Y; F0 B }1 q3 ~0 l. v! P+ I" v, f
}
4 F! t8 O- m5 x% P2 R$ z}8 [/ K j- B I: |- `
==============================================================8 E7 {; m, ]) }6 E
【程序23】
: g4 C5 S: C$ y/ t" m; l# N2 o题目:打印出如下图案(菱形) *1 }" [6 h y5 ]5 k; _
***. W" p8 Q O$ d' X% c5 o& M
******$ `$ w1 f! r+ G0 {* C; \
********9 w$ m5 s' z* z g
******
3 M, c) d, h4 N- ~***9 C0 a( f) y/ n# I0 ]! j8 [9 T+ M% c
*
% \; o! N4 a( J) H& p. x1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重! ]$ s9 a0 C Z; p- o$ j- ]. U
for循环,第一层控制行,第二层控制列。 . f" V% ]. u! |1 k
2.程序源代码:
8 r7 m4 C- i. Omain()6 C" J* A9 U& R q, t, n
{$ h1 ~# q9 W, y
int i,j,k;
+ V1 ?8 U; o7 V- Nfor(i=0;i<=3;i++)/ z& \1 S& ] p
{/ W/ X1 p: M4 Y
for(j=0;j<=2-i;j++)
/ s7 z$ l+ M4 y8 y printf(" ");9 e8 G, ~8 `6 Y+ L# c$ b
for(k=0;k<=2*i;k++)
3 w# z8 @% `3 Q9 a printf("*");
v4 ]% s1 a5 d printf("\n");' p; T+ e" n( B' C0 e: _
}% P0 [7 H, Y: ?5 K5 @. h
for(i=0;i<=2;i++)
# J) K) X. k: N; O' A* ~ {
+ F3 J. x0 ^5 \( B' z0 | for(j=0;j<=i;j++)
# h5 Q; U! }9 X' m0 A" t printf(" ");
: _: I* X9 y; d& i for(k=0;k<=4-2*i;k++)/ `7 T; |2 V1 ~' A# N8 M
printf("*");
' m. k. k! C7 M: {( m. P; ] printf("\n");* ? t! P N; y. Y, E1 I& {
}
; | q* d/ T9 u; n F" K} o% g5 O1 w( J* `; w- @
==============================================================
1 T! C% V0 K0 T/ k* z: A【程序24】
2 K2 b" E; O0 |1 H+ _" u, [题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
, O0 e" w" j1 @$ X1.程序分析:请抓住分子与分母的变化规律。
( C% g' P) p: e+ f5 t' \& [( Z2.程序源代码:
! \- y4 B, U5 h# y) p$ Ymain()& i# ?8 i9 g$ Y
{
1 U9 D0 x& x" W6 ?1 {7 Fint n,t,number=20;7 P5 ^( y1 s5 c3 D$ o; y2 w. k, X
float a=2,b=1,s=0;
- a4 p0 K3 O" Y, J" c. Lfor(n=1;n<=number;n++)
1 |- |; Q% L x# ~9 a9 D* U {) N8 u$ [( y& P0 v7 u" W
s=s+a/b;+ I" W! H4 @* ?" R& s
t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/+ A- {) P+ [& E! L
}& _) O/ ^. R5 N
printf("sum is %9.6f\n",s);* U D+ y, ?- a) U1 z
}
* V% B( ~3 ^+ V8 h' Z) e+ J==============================================================* k! u8 { U( T; v' Y
【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要1 \6 g- U$ ~3 j) a5 J
题目:求1+2!+3!+...+20!的和
4 ~8 b/ J- f& o0 a& \1.程序分析:此程序只是把累加变成了累乘。 . G! T5 [; s" Y; h2 I2 a
2.程序源代码:
5 z; W$ A5 c( x( dmain()4 w2 P: W. n! F, m
{* g- L; a) q6 q" T3 Y: F ]
float n,s=0,t=1;
( u5 q# n* d U- b+ ~- gfor(n=1;n<=20;n++)6 a; P. K# w( v( f* S; v
{
. ?9 O% i% G2 r. V0 u3 u. D t*=n;0 o% `0 t) c! {# f
s+=t;$ x. S- P2 \+ d! @
}, O/ t% l5 V& l3 d& I" m6 A0 Z
printf("1+2!+3!...+20!=%e\n",s);$ S+ w& T1 q& v: X
}( k, A! ]( J3 [0 j# v x' B6 V
==============================================================& f) ~" A7 v! W7 D* g+ f8 X
【程序26】
6 ~ L. N+ \0 N题目:利用递归方法求5!。
# ^; t; _ R1 E- U1.程序分析:递归公式:fn=fn_1*4!; E: l/ V+ L' T4 F- x
2.程序源代码:, m4 |. w% J- }: e6 b
#include "stdio.h"
9 B, y# R4 s! |& }main()! T& |; N- _& F/ x* o0 H% a1 M
{
$ Q# e' m" \( v9 _! B- T/ u! F! Hint i;
' P$ e9 G+ r2 ], \int fact();
4 j8 _4 o& Q% n- `( Nfor(i=0;i<5;i++)9 Q/ f9 T4 H; w) n t
printf("\40:%d!=%d\n",i,fact(i));* [4 B3 n( c& W* p5 O
}. A. `- z2 N5 y) t, a" L0 G2 K
int fact(j)
5 w9 `+ k: h3 T# A. d+ V7 P) B, mint j;
4 v$ O$ W0 I- `" P% Q: l{
) e# `- b! O! [3 Xint sum;
, ]( T" J% x: r/ bif(j==0)3 {' J1 D- ?4 p- i; |
sum=1;
+ I8 e( w# e; X( T) g- ~$ w Pelse
6 B0 L9 c; V7 w% u2 Q sum=j*fact(j-1);6 R. d0 ^9 v6 W* F" Z6 c# r! z; i
return sum;
$ a0 d% o8 k" c}3 L4 r1 x8 D5 F: E' G( k1 J
==============================================================
7 D2 y2 F) H7 C* \' j5 B+ Z+ _. j |