【程序16】
% x) s. N/ V8 i题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 * W! a$ c" g1 E, X6 T
% n, p8 N! Y8 n+ v3 g$ O2 Y
4 _5 D& T* ~4 d
# w$ E" \5 p$ t; z
作者: zhlei81 2005-1-22 11:30 回复此发言 / K2 @, T' m/ g5 K: O8 y3 v
. ?9 x5 D( R; ~ C--------------------------------------------------------------------------------
( Z5 k4 z5 e* r+ i/ K, x& f$ U7 M5 J7 }: t0 L$ z
4 回复:经典C源程序100例
9 ~, Y, U2 V; C R3 U& f( _. l& b1 m1.程序分析:利用辗除法。
( c# U3 y( |: r* m( j- E7 q G7 T9 H; O: A* s% m
2.程序源代码:
/ m3 G' P/ X U6 R3 |7 _7 mmain() 5 b, X9 P8 a' ~' E
{
2 u- j' K* `: q8 Z! Pint a,b,num1,num2,temp; 2 f, b2 K4 z4 s7 i }+ z
printf("please input two numbers:\n"); , `3 `; Q* M5 C0 i, S! N3 q% O
scanf("%d,%d",&num1,&num2); ) k U% b+ y* R% y) ~3 x" R
if(num1 { temp=num1; 3 Y1 c8 x" |0 G, f
num1=num2;
3 V; i7 t) H: [* x3 k. b0 H) Hnum2=temp; - m; z4 ^6 Y8 ~: z$ t; J& q3 q
} # R- s+ m! |3 C1 S. }1 b& S
a=num1;b=num2;
: |5 Y9 }3 q: [& k% H. H" N5 dwhile(b!=0)/*利用辗除法,直到b为0为止*/ $ `' \/ P: t* j0 x. W! M+ o7 i
{ 4 a0 @1 H/ p: {7 M U! o+ J% ~7 s$ w
temp=a%b; . e. w: X! _" Q i# s
a=b; * R* m4 B" L8 a
b=temp;
2 ]5 p5 a/ t# H}
' b* y* b/ f1 [8 f A- gprintf("gongyueshu:%d\n",a);
, p. m+ h8 U# c/ n! Fprintf("gongbeishu:%d\n",num1*num2/a); 0 W+ c! G0 B, Z5 L; |
} 0 I! q! t5 b7 c, Y4 M8 X5 n9 f! U
============================================================== 8 S( y0 r" u- s$ j" l; i; L* z- k7 `
【程序17】
7 y: H, o1 U6 |$ ~" ~题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 2 D' V5 c6 \) q2 q$ n8 f
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
- t9 z" J# L3 O2 Y9 P( B& U
! l, L4 q& x: w& ]; K2.程序源代码:
9 D1 a- K9 {. x% |+ C' d7 t6 |$ d#include "stdio.h"
: ^3 V1 q/ u5 s$ A* E% c, T: X" ?main() , U0 F [5 ^0 G# g |! ^+ d3 i2 f! ~
{char c; % E& @/ i, B r6 x/ _) U( g0 u5 f5 ~
int letters=0,space=0,digit=0,others=0;
: f: B+ `9 P! |/ tprintf("please input some characters\n");
8 D9 Q, T. I" @! L' Jwhile((c=getchar())!='\n')
3 P% n) w2 I! S s6 W8 s- a# t{ + P. l: d) f7 e$ _
if(c>='a'&&c<='z'||c>='A'&&c<='Z') 6 ~" D' F* f2 A" ~7 A4 C
letters++;
: ?; c/ D% ?" c1 _) c9 [! jelse if(c==' ') ) P! x X' e! k" f$ R# h
space++; ; Y8 r* B5 I8 ^
else if(c>='0'&&c<='9') c* `6 {$ ?. J; Z }+ {6 ?6 s
digit++; * h$ V+ E8 y) O! f4 L
else
% K' K7 s* q& A/ n# v, o3 Gothers++;
8 M! T- C" @) c} 4 `' w2 I/ i6 `) |0 K
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 2 T$ U9 U0 U# _, y. j& ^6 i: f
space,digit,others);
& } m% G# I+ Y# o) y6 Y} ( }# \" e$ j/ x. p8 Y, k
============================================================== 4 }2 O; M- K- j/ \
【程序18】
; a4 h) Y7 W2 I6 p" Z题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
% N/ z2 V* O+ a共有5个数相加),几个数相加有键盘控制。
! K0 I# i0 s2 D8 i2 a7 u1.程序分析:关键是计算出每一项的值。 0 O9 W3 c" h. F3 D5 J6 _$ C2 d8 |
2.程序源代码: : c& r0 k' {$ t" X
main() $ D9 u! o- R9 |2 ~
{
" t) ^9 O2 {, e% D* \int a,n,count=1;
" j6 d/ ~& W: X3 T9 ~$ @6 t' Zlong int sn=0,tn=0;
# N( L6 i# P) R. A' k; n: a9 ~6 hprintf("please input a and n\n");
" A8 n9 z. {; oscanf("%d,%d",&a,&n);
% ? J! S3 z& I8 wprintf("a=%d,n=%d\n",a,n); 7 ~& J/ O3 G9 j; D
while(count<=n) & u; s6 ~% e: E% ]* z
{ ( G7 k5 X9 K. O
tn=tn+a; ' n; a& ]7 h* l2 d
sn=sn+tn; 8 |/ u% r' T& k. p5 ~5 x! j2 t
a=a*10;
( a! M3 q. ]7 w- U( c0 Q++count;
6 v3 b6 O/ n9 F}
* R+ F! x% K$ ?! ?9 M3 c. [printf("a+aa+...=%ld\n",sn); - ?- @, F+ j; f; D; ]# _
}
2 O$ x! i. c5 x! n/ _* d==============================================================
6 O" |. B4 `+ C' ^" C; b【程序19】 }: u1 V. ^* [8 y- j+ G
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 + T1 _* S U/ |- A
找出1000以内的所有完数。 3 H2 u) Z. d2 z9 j) C
1. 程序分析:请参照程序<--上页程序14. : ?& E0 g0 X! e, y
2.程序源代码: ) X8 u% j, n: b9 ?
main() 3 f6 T# b. ?& {0 P0 V% V! ^
{ * o- N" j: D8 t' k
static int k[10];
! f7 }9 u0 a" H6 v1 u5 f" Vint i,j,n,s;
$ \9 Q+ S% Q8 O2 h) [ `for(j=2;j<1000;j++)
8 r, ~4 l1 l% h; F8 j$ A* Q{ * C% { W# B8 l& S5 [
n=-1;
9 ^$ ?# }& A& Bs=j; 2 x7 Q+ d+ Y- T! {3 c* u
for(i=1;i {
; g! l& z+ R' H B& Iif((j%i)==0) ( a4 e) p) B" t" X
{ n++;
6 V' o1 b* s. E5 zs=s-i;
4 c! f8 |, }# ]9 W( j9 w# Z* Qk[n]=i;
. f5 J6 N0 @2 y; L8 w} : ^; Q6 x7 P* P/ ~
} - B9 H9 w# L/ E/ p
if(s==0)
" |# _$ G H' Q{ T8 V& S7 T: g& t: V# K6 ~% ~
printf("%d is a wanshu",j);
* x. d% y+ u$ p& Vfor(i=0;i printf("%d,",k); % C# M+ |0 D0 N5 a, s, a9 H+ l+ y
printf("%d\n",k[n]); t& E& V! \$ o' A. ^. P5 e
} 7 M5 x' I8 Q' S) V$ i5 M/ R3 F
}
% n% H5 B6 c; p& d$ I. ]}
3 s- }% i. a/ J7 {( x============================================================== % s7 H/ V' f3 Q
【程序20】
9 i4 v' C/ Q6 L; n! |0 z) _题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 7 N M- L9 o5 O
第10次落地时,共经过多少米?第10次反弹多高? 1 z% ?/ s7 a& s3 g! U, H' k4 O/ J
1.程序分析:见下面注释 - U0 m' L1 V) i1 Y% z4 {
2.程序源代码: ( Q" n2 D) s$ r, }* ^) p
main() 8 M7 |- Q5 h1 q+ t2 z
{
" d2 h% Z2 J1 S# {0 G7 n* Hfloat sn=100.0,hn=sn/2; - l3 n" Q: R. O+ W: |4 c3 A$ e, r
int n;
+ b1 S l+ H4 Xfor(n=2;n<=10;n++)
7 @: w7 R! f2 p4 t& W- G{ 7 B. r9 p7 A5 X2 r. Z' g" N" P
sn=sn+2*hn;/*第n次落地时共经过的米数*/
0 N" D" a& |- V% P) O. @6 `$ J0 zhn=hn/2; /*第n次反跳高度*/ % a7 m0 L" W E/ `
}
. H: ^: F6 ^; T" }printf("the total of road is %f\n",sn);
3 U5 I+ i1 x. M4 cprintf("the tenth is %f meter\n",hn); / G% [ `% D; Q
} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
6 T( ?4 r2 C k: m2 w2 G 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下2 H: C/ C* j9 [, A6 Z5 V
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
$ u& D- \: t; r# y# O; ]1.程序分析:采取逆向思维的方法,从后往前推断。1 T j( V" e% r" z
2.程序源代码:& [$ y$ f9 o! ?' E) |6 i7 v; l; n
main()
9 Q2 R x: `8 Q3 Z8 p{
1 P$ C: N4 |3 X8 F% @$ T/ M& sint day,x1,x2;. }; l# p9 q* C# K9 V
day=9;
$ n1 J* W# F5 I2 V& lx2=1;1 W6 o0 g# I2 E8 G, K( ~
while(day>0)
* t) c# I6 |9 T% P {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
: t, m) }) _0 _) \2 w1 {- m; N x2=x1;
* c9 Y9 U( s+ L" \/ H, B day--;: i5 V; N9 Y, s
}. D6 Y: ?+ [3 f& }& }3 Z
printf("the total is %d\n",x1);. O+ P3 O/ F8 _; e+ b% W
}! N2 Q* J0 C5 P3 l
==============================================================
9 S T2 O& a* A. Z! G【程序22】
# e7 Z' T v, ?: S0 Y1 p题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
7 B, @* I, i: K8 [ 比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
+ g. }9 d) |# v* D$ h4 j 三队赛手的名单。
" q% j2 d6 G) D5 |; y1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
5 p& P/ R/ S' e 则表明此数不是素数,反之是素数。 ) |1 n& t0 `: z5 K/ @; }$ M
2.程序源代码:
% \6 T" V; n% Omain()4 S3 o+ D" ~) H, c4 O
{% a" C! \, \; L; R2 W, n
char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/5 b# `/ a% P2 {' ~- m
for(i='x';i<='z';i++)# Q! s i7 D1 Q* J6 Y
for(j='x';j<='z';j++) a# R4 | W$ |- V8 p
{& E% W" k- h, ]; l& y2 f
if(i!=j)
. D2 t; I- U$ M/ Q! f9 d' L for(k='x';k<='z';k++)7 P8 }" a7 {( Q' s) G9 i5 D
{ if(i!=k&&j!=k)$ ?- [5 E: ]4 B2 l
{ if(i!='x'&&k!='x'&&k!='z')! y4 `- f' j; f/ d8 N
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);6 C+ P$ V4 A- {: \
}
2 Q& S/ p: x% M- M6 d1 _, X$ K }
" u; d" S3 w; X$ e- | }4 ^) U+ V! {# w3 B+ J1 X
}. |' t7 P3 Z9 W; `1 D! ~, y
==============================================================) s z/ Z/ }1 V$ k T& f
【程序23】 l2 J3 y( Q) K- K/ M$ o% ~
题目:打印出如下图案(菱形) *
' o- \7 p# s& H7 y& s3 ^; q***. N9 o7 y% \4 f& N
******
9 r6 u8 l# U7 n6 Q********, b! Q& n) ]7 e/ l6 a6 \
******* g; ]3 W$ A& w7 T
***# A. x) R+ s0 H; y( L
*
$ Y5 ]: b' W* i: h& f: j) Q1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
$ C- S/ [1 F0 R. |. p; D( [ j for循环,第一层控制行,第二层控制列。 , I0 }$ W! U/ z: b# P
2.程序源代码:
( N; y; d/ `; h0 X/ l4 Imain()/ o) Z5 R1 I0 ` ^
{: `7 j1 Q4 C* e0 j. H- p9 P
int i,j,k;
% f; a3 L6 Y8 ~for(i=0;i<=3;i++)0 Q9 m' [2 j; v: y# D% }! [9 s
{8 m3 Z8 C8 m9 \ i/ k" Z
for(j=0;j<=2-i;j++)
5 _+ N4 R! t+ |+ [: A9 C w6 } printf(" ");
3 t- i1 e" N* \6 _5 B0 O; _9 w for(k=0;k<=2*i;k++)4 ] d) o. C2 U2 k; U/ ^
printf("*");6 e% X5 _( v* g# V8 N
printf("\n");
; w$ k m. U& ]$ R0 } w }
5 U2 {; l! t3 @. ?: {8 O( u }for(i=0;i<=2;i++) `0 F) L1 S- S
{0 l' W0 _( K" W
for(j=0;j<=i;j++)2 J1 y, M( o" R" V, q# d1 O" q
printf(" ");
, P, n8 F% C8 D+ j" E' u+ M for(k=0;k<=4-2*i;k++)/ a4 e; |+ F$ c- B y+ `
printf("*");& ?" B) z" z. F; e- I% ]/ M
printf("\n");: _6 O" W- P9 `7 I$ |) v
}
* v, M9 s$ i0 }! m}
+ B1 |7 D+ I* Q: r; n==============================================================/ k9 c4 ^4 H4 ?3 ^- b' J5 t+ h
【程序24】 1 e0 L/ f3 C. v e5 p. \* }6 [
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。8 G9 d( a7 Z' R* V3 M* @
1.程序分析:请抓住分子与分母的变化规律。 8 ^* s3 x0 u! B
2.程序源代码:
# j+ _; |6 H- _5 ^3 b$ H l( N0 `main()
, x! t6 w3 T5 D( m$ T% G* ]7 O{
& t% g# E2 ?) V" |int n,t,number=20;
% r( C& h0 u, e% o2 |0 ]% mfloat a=2,b=1,s=0;
* e) [# p5 k4 Q+ O- wfor(n=1;n<=number;n++)5 s5 u0 F! X" m. n. k) H) E0 w- k8 k% q
{
* E" F: D( ~ B3 C; A, G# { s=s+a/b;4 e; _# S ]6 b" g) x7 a6 L
t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
, ]) j N) f5 K& F) z/ _7 ] }
& z# I) |! S. I. ?! a3 pprintf("sum is %9.6f\n",s);8 V8 i, u7 u% i2 }' h+ ~
}( h+ X% `3 l* d2 ~
==============================================================
- P! }8 j9 r; J6 S5 b: \【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要* `8 B6 x) U s! a* Y7 r% _& j
题目:求1+2!+3!+...+20!的和) A, E( x4 |# W: Q9 a D2 C
1.程序分析:此程序只是把累加变成了累乘。
5 ~& ~% X+ F# p- b$ m! y2.程序源代码:
; l/ Y: X# l$ P1 emain()$ {4 f. m5 P3 x# {8 U
{
5 ^# I5 e% [5 _4 Y' C2 {- x/ Xfloat n,s=0,t=1;9 z' h) d* s& E7 A
for(n=1;n<=20;n++)
2 ^ ^9 J# o# j/ x {5 t/ P3 R- {6 D3 Q/ L, A- }: Z8 K
t*=n;, I) _* Z+ D2 _) X& K( a. _4 d% B
s+=t;% |2 o# v5 |4 b
}$ v4 K$ c* \% w! M# ^6 ^6 f
printf("1+2!+3!...+20!=%e\n",s);
8 w( l0 t8 z6 a}4 o9 y1 p; f3 ]2 o, K' H- i
==============================================================
+ J; t' m/ A, C7 B9 V+ a【程序26】
; }5 n( e; I7 q) b# d1 H题目:利用递归方法求5!。, Q+ X6 v/ S9 Q) F
1.程序分析:递归公式:fn=fn_1*4!
& a- H* y1 G+ m3 q p, g2.程序源代码:
% C9 U; M E% V0 E3 }#include "stdio.h"
" U1 S0 H" G$ z) N9 T! r+ h) W! {main()
$ i# W$ f% R% Q6 G* `{
6 J6 o7 o6 L: c& Q3 T. |- Cint i;0 H ]/ s6 `) }2 l; }
int fact();! J3 \6 h% f2 K0 b7 h- ~
for(i=0;i<5;i++)* \3 A, J; s& p# R5 ?
printf("\40:%d!=%d\n",i,fact(i));
; F, Y' r' o+ v2 o6 R0 v$ s}" ^& x) B0 A/ g
int fact(j), I2 y# C$ W% i0 e8 t# h# o
int j;
2 h* T( G/ u8 X{
9 D; C' v7 H3 b0 x; F+ U8 Pint sum;' b& u9 p+ J3 ?9 a- M0 Q
if(j==0)
7 p" N+ l u! c! D; B sum=1;
) s1 q+ J) S R6 o2 q+ q1 C s/ relse* m3 [% N. d3 o/ ]0 Y( V
sum=j*fact(j-1);' Z) e# \0 u( n; [* d' R4 ]
return sum;3 | {: X) z9 D0 }
}' c. a# ^0 C" k/ \9 K. A5 x7 t
============================================================== ( D% u: @0 @) R1 w& ?0 S/ i7 K
|