【程序16】
$ p' ?9 P, J' P0 G3 u; \题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
: _& ] G; r' }' x. {( L3 z0 o
8 T& }5 D! d, S+ B0 b, |' e7 b/ W. v' J9 T
5 C) S, i: v3 t. C作者: zhlei81 2005-1-22 11:30 回复此发言
) }' b1 u, r+ K
* d# ]$ e/ v' K# C# Y% G-------------------------------------------------------------------------------- 9 U0 e% I5 @0 f/ O& y' h
! p2 ]* F% I4 `* N/ l
4 回复:经典C源程序100例 ' D O0 }, x0 E. d
1.程序分析:利用辗除法。
5 G+ g f9 m! S ]& E2 e/ s% u7 w. y$ {) S
2.程序源代码: $ q( i8 W; O ]5 k( G
main()
& m3 l4 L5 x- [7 g! C{ & a5 n5 m: H8 } R+ q4 F
int a,b,num1,num2,temp;
7 L8 {5 w' y" v' _& C# dprintf("please input two numbers:\n"); 7 P8 X4 _- ]; m
scanf("%d,%d",&num1,&num2);
1 e5 ~+ t E# Q5 v+ O0 B, oif(num1 { temp=num1;
5 V5 ~6 F) }/ c4 dnum1=num2; 7 A6 r$ Y* ?# [8 f& J
num2=temp; ( V" I4 t" G; v
} $ D$ d+ [6 h b; L
a=num1;b=num2; # |- l/ J+ D9 t8 K. x5 W* P
while(b!=0)/*利用辗除法,直到b为0为止*/
* k' E: p# T0 \: j+ l0 C7 y N$ m{ 2 C- e( |+ f+ f$ e9 G/ N& t- h. R: {; W
temp=a%b;
" o( Z# Z2 f6 O2 B/ I- oa=b;
o8 l. J' ~9 p8 X8 Q3 `b=temp; . u. G" R) u& H3 M
}
$ v6 Y, W8 f1 F+ c8 l3 Uprintf("gongyueshu:%d\n",a);
a! g2 \, C% ~; uprintf("gongbeishu:%d\n",num1*num2/a); 2 Z; b+ t. q+ t! d: F4 h
} 1 Y& [. F$ i( ]' L
==============================================================
6 u( H5 D) ?( F& w9 O6 F' M+ Z3 J【程序17】
9 @; C3 m& n, e+ B& o题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 " K5 G8 H/ e0 {7 o3 E7 c
1.程序分析:利用while语句,条件为输入的字符不为'\n'. 8 J( Q7 M; S5 w* G
- T% L0 a' ~" `( k, [2.程序源代码:
8 U, b; |% w7 j( A0 v#include "stdio.h"
/ i) x. b5 d8 o* a) I( _main()
1 @& ]% l& v: M* P{char c; : t- Y* P& t- f5 _' d1 q' E0 C
int letters=0,space=0,digit=0,others=0; $ `8 D3 y' r, C+ E$ W2 i3 ~
printf("please input some characters\n");
y) v+ h0 }) G# J. |0 f ^6 A; V( Ewhile((c=getchar())!='\n')
9 B( L. _9 s ~: ~+ e{
$ p. K6 O( j% N* q( Kif(c>='a'&&c<='z'||c>='A'&&c<='Z') ( \0 i1 \% i& _4 b) U/ z
letters++; % D& u( V7 S2 r: o7 R x6 E" X
else if(c==' ') 6 a) N" c j# `: O6 Y5 p- _5 O
space++;
+ b+ C/ Z8 y! @/ P5 felse if(c>='0'&&c<='9') # |* [1 p) k3 J& r: E9 s
digit++;
G8 x5 K9 b6 S5 e5 L- b* g8 L) helse
9 |* y3 z# h" ], M0 N7 fothers++; 9 I# R8 ^1 {; ^: P! B
}
H0 C2 n u8 Y1 S& F4 K" m ^( @printf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
. V. U' L# }( |, {2 F# ?space,digit,others);
' b, W5 R' D6 z$ ?3 o& H} . ]6 K- C+ |9 B- h4 Q; z% i
==============================================================
0 k8 B# `# w6 L+ c【程序18】
$ L" T2 y. A; h# G- _, U题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
; V5 |, N) u" A: n" Q共有5个数相加),几个数相加有键盘控制。 4 s0 F- E/ f3 |
1.程序分析:关键是计算出每一项的值。
7 I* f6 c) { A& l" Z- R: v9 `2.程序源代码:
8 w, c- I) G6 I, l( }# h- Emain() * c' g* l% Q) g9 l' t
{
6 x& E7 ?" ~! s2 Q; ?int a,n,count=1;
3 ?0 i# ?' ]8 r: N+ e5 klong int sn=0,tn=0;
( Z% @: H% q% C. ~% Y/ x! l1 vprintf("please input a and n\n");
6 H6 ~# f+ C2 [( K, qscanf("%d,%d",&a,&n);
) A: \1 U, G1 G4 T6 [. kprintf("a=%d,n=%d\n",a,n);
* r. ^6 R- L9 r1 Iwhile(count<=n)
8 F( i' Z; y1 ^! q4 R7 J- e{
) O R. c! T% btn=tn+a;
* j% m; b$ N7 _- c) K8 psn=sn+tn;
* N a' L8 ~. Y( s5 T+ p2 _+ p( o- c) Ra=a*10; $ v/ Z* y0 E" Y2 `! S
++count; 6 N p! n5 y6 A$ k2 B
}
( S* v0 a" @' i! ^" D" w1 u" Kprintf("a+aa+...=%ld\n",sn); ( S7 o! N' A0 @. P
} 7 L w7 M3 [4 M) _$ {9 Y
==============================================================
5 q" V5 d/ m( }1 C. b( a6 g【程序19】 - k7 S' U0 t s- [" e
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
3 N: u5 E8 ~3 D找出1000以内的所有完数。
# R, `/ ^. }4 y9 F2 r1. 程序分析:请参照程序<--上页程序14.
( M3 T' t# ^2 N' ]2.程序源代码:
! x% \! ~* w C- N4 }5 N* ]+ vmain() L8 }2 j- U2 N
{ : [- r k$ e* v/ Y% _
static int k[10];
9 r( X' C: z: p* Sint i,j,n,s;
, g6 y1 Y/ Q/ j3 L Wfor(j=2;j<1000;j++)
' `* O# z: [ u4 M8 }{
5 E2 \1 F [- r6 sn=-1; ' E, W) @4 H! V
s=j;
6 a+ J6 S4 `8 h- M0 s8 H& Zfor(i=1;i {
# T+ o x* _ f& y( Iif((j%i)==0) 8 w- P8 p! C3 X" q7 h+ O7 w5 K* @
{ n++;
2 k3 S4 I4 \7 l) v5 n5 is=s-i; ; z7 z% Y8 p' C6 j7 b; A3 f8 \
k[n]=i;
, z- r3 t* v7 r: q* G}
! |( i- b! n/ U# a3 T1 Q# p}
, y8 f( R# C% ~. p- Q$ T1 [if(s==0)
: L7 m, M2 A% i{ # f+ r; [; A: l) y N* v
printf("%d is a wanshu",j); 7 b, B N3 M# q& k* _1 T5 b
for(i=0;i printf("%d,",k); 4 a$ |. @! j: W7 G$ e0 \
printf("%d\n",k[n]); # ?! d6 _& @" A/ ?0 T
}
4 b4 `6 T L2 s" B' m a k}
; W/ H' v$ d- n' q8 w}
- B6 x1 q& t: e5 Z8 h3 e+ z==============================================================
Y, ^ t4 _8 _7 m4 ?【程序20】 $ D( d4 ]* D5 a. v- S/ o& w
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 0 }( ]% `/ D% _! E
第10次落地时,共经过多少米?第10次反弹多高?
% c* H) Z' u9 Z/ z/ Q$ V1.程序分析:见下面注释
0 B/ `. \0 X) E, l9 V1 Z4 e2.程序源代码: - \: S8 T/ ]& r8 F* c* c
main() " S6 T; s8 |) m: I/ i
{ $ E- P5 H, I6 g* p2 @6 ]- u7 r) |
float sn=100.0,hn=sn/2;
5 S9 A) Z% ]4 i8 Iint n;
9 w( W) B* H" S& Cfor(n=2;n<=10;n++)
, |( n$ I# L7 |7 ~$ L% l8 J K6 [{
* e- _ U' Y4 n; K+ i& Nsn=sn+2*hn;/*第n次落地时共经过的米数*/ & {' G; z+ ]! \
hn=hn/2; /*第n次反跳高度*/
) P2 d5 i v. D$ s3 }* B5 s}
- H/ k( S& `6 i) y9 i& c) {% vprintf("the total of road is %f\n",sn); 3 [/ |6 p a$ A6 o- d, j
printf("the tenth is %f meter\n",hn);
" R% x3 ?/ J9 O7 r+ h6 f& x} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个6 p e4 Z+ q4 H5 j/ G
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下- E0 L2 u7 `$ \/ q
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。* \1 b/ F& J9 _* ^0 ^
1.程序分析:采取逆向思维的方法,从后往前推断。
1 ?' g) G# L" {) B1 v$ r3 R' x2.程序源代码:
7 I3 d- J2 b/ d( ?: r7 s8 ]0 hmain() M# x9 l+ t' p% j4 n) h2 b+ ~% Q
{. i$ w7 O% ~- i Q. k- q4 R
int day,x1,x2;
y4 _7 H4 S6 ^+ q3 Lday=9;
0 J" a1 O7 x! z D) Q9 Z% Bx2=1;
, e# D7 j3 [! _, R) g/ Z) Vwhile(day>0)
7 ^1 u/ C0 Q5 m* c0 `7 ^! c, | {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/. S+ B( V. ^7 j
x2=x1;
" x2 a6 f ?9 Z% ?) p day--;
" o2 d8 t. F0 ~ }, `$ c( J, F' y; N- ^
printf("the total is %d\n",x1);
$ s! E5 s8 I. ^+ i- d, p$ P" O}
6 I& n1 q( A2 b y' f==============================================================* \4 d! K- r5 \! Q) ^+ V
【程序22】
1 t+ v& w$ D! O' O' X题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
3 q/ N3 W6 y& \' }) U3 J, z 比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出- e- D$ ~6 g7 ^+ v
三队赛手的名单。 2 x0 V8 U# y1 I: P! w
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除," v; N3 G8 @) {% p
则表明此数不是素数,反之是素数。 & O& a/ o; i {4 L" q
2.程序源代码:9 T2 `) Q1 G+ `" e9 t3 ^
main()
, ~2 l7 m1 k( p{* h6 T0 C" s3 o) ~/ w9 `
char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*// |" i3 B$ N% J( b- ?. `+ |7 w
for(i='x';i<='z';i++)
3 |" ]* V& a x! o) } for(j='x';j<='z';j++)& X' Z6 G7 _ F( N1 O! j
{2 T' w" T: \7 f2 i+ E M
if(i!=j)8 q% i; @) D, U
for(k='x';k<='z';k++)3 a3 e L* m( ~+ }8 K) y% A
{ if(i!=k&&j!=k)
" R7 V+ w8 c8 P { if(i!='x'&&k!='x'&&k!='z')
* d. [, Z1 {% h9 O. a: m printf("order is a--%c\tb--%c\tc--%c\n",i,j,k); `8 L( [8 d5 f4 d8 d* U: o
}
* A+ f' ~8 S' q6 } }/ g; ~9 B" D6 y) B: r8 b
}8 Z; Q( j6 n) E- N+ U
}
! e/ X0 o- E+ E& ~, I==============================================================
6 K! C4 p1 a1 @【程序23】 & h9 m! c. i2 S( E, g
题目:打印出如下图案(菱形) *
; w" [2 a$ N Q2 A. {" v***
! W' x# O$ h( C' B- d0 W******& R, w3 ]% _+ z, ]
********
0 x7 R2 |/ a X******* e4 n, O/ j& z* r0 x, y
***
$ |* B$ s W% w a& a# w*! y( p4 E J: u5 {! V& C
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重2 M" K$ \2 M; S8 L
for循环,第一层控制行,第二层控制列。 6 U3 c1 k) ^: P6 f+ C
2.程序源代码:
' w, {: U& u1 { k! S1 Fmain()
8 L; i1 e' P6 q! Q D{+ Z7 M, n2 n. B0 W
int i,j,k;+ Q3 U8 |# E+ E/ s
for(i=0;i<=3;i++)2 V- V" j9 I1 P0 T$ Y" y, a
{
3 M4 K2 W' T+ z# C8 q for(j=0;j<=2-i;j++)
, j& l, j# n7 Y$ M, J( @% _( k printf(" ");
" c; H, {2 e6 d& W4 ~# o' l& b for(k=0;k<=2*i;k++)% E, T* {* \. g! t% k& x! g$ m
printf("*");
) D1 G# A+ f5 }! y. E printf("\n");
; _# M7 X- h* i9 }5 E3 o& b( e j; l }8 l7 ~5 V; ]. @6 X
for(i=0;i<=2;i++)7 n- ]$ v' E( v8 u1 Q
{
8 ~) J: Z" m N7 e6 P- R for(j=0;j<=i;j++)! S( @2 a: y7 A. P
printf(" ");
4 X$ R! t6 |) J7 i$ x2 K# { for(k=0;k<=4-2*i;k++)
/ ]8 l/ d1 |! V# s6 _( g" p' ]) q printf("*");2 i7 [: W1 ~- _9 a% D1 g5 B' B
printf("\n");
4 t! W* C3 \ a- b$ L" o }
) V& I' x- Z) h. x+ @( ?}7 b' \& N" o# H8 Q- s2 |, a
==============================================================. }: T. V% _* A p
【程序24】 / `% c7 Q; S) O
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。# Z. J& `1 r3 N2 N+ N6 s6 p
1.程序分析:请抓住分子与分母的变化规律。 2 U3 o0 G$ q& I2 H" o
2.程序源代码:: T; `. K3 `. |" U3 q* o# p
main()
R+ j+ J$ N( d& O{
5 I3 L& o$ G) T: n w+ Yint n,t,number=20;
& p* y0 L- `) Ffloat a=2,b=1,s=0;# q/ E. O' b; k0 B0 e R9 K
for(n=1;n<=number;n++)
8 g" n5 K! M. d6 Q( y9 i% b9 _ {: R! x7 G6 x; M: w. b& o
s=s+a/b;
5 m# \0 z: k4 ~1 [+ p' X1 F t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/7 `, t8 d/ K* ]( u" X
}7 |+ D+ D1 s1 Z4 G
printf("sum is %9.6f\n",s);
/ D9 n! F, i2 @$ @8 g}
0 Y/ {" D5 T7 w==============================================================
2 J4 S1 s4 ^/ d( o【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要
6 u- u& I1 F$ H$ j题目:求1+2!+3!+...+20!的和: }3 x! _) @5 K
1.程序分析:此程序只是把累加变成了累乘。
7 W% L% P2 L: \ ^$ N1 r; ^# k, P3 Q2.程序源代码:/ p/ F# ]. f5 i- G0 y3 j* ?& S
main(). A6 u: D1 i7 K: V0 q" j, ]5 t
{ L; a7 Y* w5 @ i0 n7 S
float n,s=0,t=1;) O6 M# L( n9 Q) z& x( n! F5 @
for(n=1;n<=20;n++)
! I/ B2 f2 J! u3 e& A& @5 j k- |4 a {8 C8 j: |$ K2 W w/ K% L
t*=n;; r. L( r7 T( V& E) c6 n( G; O# U
s+=t;5 T1 S: H. H) r% n) M+ r
}0 J. }" z0 }9 D) w9 R( q
printf("1+2!+3!...+20!=%e\n",s);( j* W! @( F2 N T7 u
}
W$ g* k* V1 y$ z# }==============================================================' e, ~" v7 `5 v3 B
【程序26】 3 O% f* d2 W3 _
题目:利用递归方法求5!。
3 j2 L2 T$ q: B) y# I1.程序分析:递归公式:fn=fn_1*4!
! k8 z( V( v4 T4 }" z4 t2.程序源代码:
- Q& s. d5 M1 f! [2 p2 h7 O#include "stdio.h"
" ?4 C0 T" ?) V* h- V8 i, {main()6 d1 `- U- o% S
{
; p- i* W6 @! g! Kint i;& t( K: m8 S% K- L
int fact();2 @, D- N0 H& N; y
for(i=0;i<5;i++)
1 ^; _ A- z/ Z( T E% } printf("\40:%d!=%d\n",i,fact(i));1 ]" |6 r3 U. L& Y& T
}0 g, X/ V( ~6 K; t
int fact(j): f' u* W9 ]5 K6 P, [8 c# H% E/ D
int j;, ^# c' E' E" u
{, w& O# V* Y4 W: |$ ?3 c$ S* x
int sum;
" K% p6 t8 n6 b$ R2 g4 V0 Uif(j==0)
o# m1 r# }7 s+ y sum=1;
6 [& ?% D0 ^0 E0 E" v. qelse0 K7 Q1 U$ z. O
sum=j*fact(j-1);
. G& p V8 h$ d4 w5 _return sum;
9 [7 j: o* E; L" Z# S$ ~5 B+ `}! c# E6 A! s2 N! U
==============================================================
5 d" K1 l6 H& B% f |