【程序16】 ; {* w) K. ^1 l: N! g' c* e; D
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
" {. I5 q; _6 l* J& B, _" Y* U* T. f( ~
3 h9 b7 B' J% R4 F/ r3 G$ e7 `
' |/ `$ W" I0 y' L* }$ ]% U
作者: zhlei81 2005-1-22 11:30 回复此发言
5 c( ]# d/ S8 k5 J \% d( s: r+ a7 p$ y, b+ L
--------------------------------------------------------------------------------
4 S/ e2 g# J) R5 ]& J8 q
) ?5 G5 S5 |, ^2 b5 N# J4 回复:经典C源程序100例
8 n! i& i+ I4 Y1.程序分析:利用辗除法。 0 q% r8 T9 S' L/ v" Z' ?+ J
. C1 @8 u1 C+ |4 U2.程序源代码: # e0 o5 |6 o5 y- F% m
main()
5 F& u" o2 O4 ?{ $ I8 P$ l/ T+ z; V' B! x( o) M
int a,b,num1,num2,temp;
) `/ U' U5 a5 @' a& iprintf("please input two numbers:\n");
9 y4 }4 |' M, }+ J; Q6 V( Tscanf("%d,%d",&num1,&num2); ! f& N* S/ b: }- j1 {* F
if(num1 { temp=num1;
: t4 V) p8 Q( e% j* \- ynum1=num2; 6 K, x4 h0 Y$ s' @; l7 ?
num2=temp; , y. w. A% w. \. L8 h$ b! f
}
- \0 {) ^# W0 r4 G& f. sa=num1;b=num2; # {3 i; t: ^/ O8 {- t* Z
while(b!=0)/*利用辗除法,直到b为0为止*/ . U- P/ B. C* m5 R
{
3 d( ~% s4 n! @2 r+ Q, ltemp=a%b; " Y# a G% N7 o0 K+ A
a=b;
1 g) V& _& q& @ {b=temp;
7 ^: o; S7 h( w0 k$ r+ }}
% Y, p1 i5 G3 _! _& kprintf("gongyueshu:%d\n",a);
& m! Z7 U3 X% lprintf("gongbeishu:%d\n",num1*num2/a);
3 y+ b* L0 C+ }6 m( \* r! p} 7 p. \# z" _4 G ?+ C) A( N$ ^9 d
============================================================== : o. k4 ^4 v8 n' Y. N+ I0 C
【程序17】
- n/ k6 }, w0 D7 N题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
: b4 M* J8 A5 H/ j: z; b1.程序分析:利用while语句,条件为输入的字符不为'\n'.
" k0 C! L$ Z% h& H( h# F5 a7 V$ C2 S# n' J' H2 P7 y
2.程序源代码: 3 ~3 L ~6 L8 t2 B9 Y% [
#include "stdio.h"
( Y, g8 ~( H, F2 o+ Q& L1 mmain() ) ^* \; l# `4 ~; e$ y6 ^
{char c; - B- \4 t: n! A. V; G
int letters=0,space=0,digit=0,others=0; ( M4 J' C2 P; L' c1 O8 B; l) X: s8 R
printf("please input some characters\n"); , `' E" H9 F+ a/ O: c$ Z
while((c=getchar())!='\n')
$ `0 Q# a7 [+ s( @4 [2 X{ z$ n1 v+ a2 j4 u' X" ^
if(c>='a'&&c<='z'||c>='A'&&c<='Z') 4 O/ f; `8 m5 U1 t/ o* p/ R
letters++;
6 ]7 N3 l+ }% ?! k% Nelse if(c==' ')
" | r( S. K- O" mspace++;
" q- y; F" m! t+ T! O0 Oelse if(c>='0'&&c<='9') ( ]+ o [9 ]9 C# ]- P
digit++;
& E3 ^& q- ?6 F& ?' o' telse
& Y) Y8 h1 x4 `: E+ a% q# n! zothers++;
6 d7 l3 r6 r- i$ H# Q5 A} , i5 F1 k0 B6 M* b
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, ( C! w9 ~9 ?! w, ^, _# F
space,digit,others); " }& C) p; }) L9 B" V# [( U& ?
} . C* e* c2 W# M3 S
==============================================================
8 D+ y. b4 k" w8 q7 P2 v【程序18】 % @( i t2 k- [5 C9 A
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
5 E7 ~# h( [9 J9 X" b共有5个数相加),几个数相加有键盘控制。 9 |" z( Z, g E1 a0 |" A* v
1.程序分析:关键是计算出每一项的值。 3 I- \: v" c/ r$ i# a9 N( k6 \
2.程序源代码: - A9 F" F0 E! V8 a$ R) z
main()
2 z! W9 u* D+ I5 C3 z( T- w{ % Z7 Y' n, d% E4 v9 U: `; T
int a,n,count=1;
7 P9 i2 n( R& i- qlong int sn=0,tn=0; ' m6 \2 _5 `6 @
printf("please input a and n\n");
- E5 L, b( ^+ d/ Jscanf("%d,%d",&a,&n); 8 M6 d# T7 q$ r' L
printf("a=%d,n=%d\n",a,n); 3 ?. d/ k' J/ \+ b
while(count<=n)
) V# X3 Z' ?& X$ C! q3 C{
3 r2 ], I8 B3 \( A `tn=tn+a;
+ l* I: H& M/ }7 h3 Psn=sn+tn;
" Y- t1 J8 y! ? ma=a*10;
9 W6 [7 r, e- t& O8 w- {% f++count; 2 P [% Z$ ?8 h# \1 Q2 a% p
}
# n/ w/ u3 Q0 ]- ^printf("a+aa+...=%ld\n",sn);
/ S& Z! E( a' ?' n _+ @, y} Z- N" z; T3 ^1 b/ z* B+ a
==============================================================
: s% i+ Q7 q4 n7 j$ r, v# a【程序19】
. i' b+ T3 G+ O+ ?( }4 G" Q题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
- t2 z/ x. {' o. q找出1000以内的所有完数。 . ~0 `# g4 l3 W% n/ t+ i
1. 程序分析:请参照程序<--上页程序14. ?2 B) G* i2 A6 c/ @% Z/ A) C4 s6 b
2.程序源代码: 3 y0 ]% ]& E, B: U* f* g$ Q7 m: k6 D
main() . e7 N! U3 P# o
{
4 _1 i: G1 C, \2 o1 l- Wstatic int k[10]; & w H/ l3 ` U( o9 h9 q M
int i,j,n,s;
. c/ Q) v$ e) _/ _6 ofor(j=2;j<1000;j++) % Y4 r# Z! G) \* D
{ & ?* f4 C: ~/ x0 i( u
n=-1;
+ {: t+ H- [) ls=j;
8 F/ s5 a. M, |for(i=1;i { J) K& c, X+ Y
if((j%i)==0) 4 _% C, M, D. q& c! o7 w; `, U
{ n++;
- Y6 z6 c" g! C) V Fs=s-i;
( R: \$ T) ^5 {5 _) C1 hk[n]=i;
: N9 U8 `0 c4 L$ P} ) D. I" G0 ~/ }6 |8 |
} 1 S6 }; p$ h. o! K% b. c2 n
if(s==0) - T0 A' o: ~/ O
{ 3 ~* L$ z# x9 z3 c8 v* y1 O
printf("%d is a wanshu",j);
8 F; Q, H0 C. zfor(i=0;i printf("%d,",k);
& W. D) @# t/ E1 Oprintf("%d\n",k[n]); ( r1 J# q8 n n) r: J9 Q
} . h+ W8 n, `) B0 n: a8 A
} ) y6 I) Y: G# n6 A4 e* ]
}
1 g; a; N6 o! n6 Y==============================================================
, q! ?4 e/ W- ^. s8 H/ j3 I【程序20】 0 |8 F: r8 F4 j: J
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 . N2 B5 r" Y' Z3 M
第10次落地时,共经过多少米?第10次反弹多高? 7 h f0 t3 G# F3 q
1.程序分析:见下面注释
L S- O3 H7 r: Q2 W2.程序源代码: % b3 w& e( X. i: G7 d
main() 2 j( e3 v2 |9 T' J! Y" g) ^( Y
{ o" N9 [7 c3 P- i
float sn=100.0,hn=sn/2;
8 j f% E5 X! K1 ?" U) k, M6 _int n;
2 O) J) W7 ^8 y5 J# F7 xfor(n=2;n<=10;n++) 1 k4 d V' q8 o R8 B* W5 y
{ ' i* S9 g# o$ H+ _! E+ Q1 J
sn=sn+2*hn;/*第n次落地时共经过的米数*/ 9 Q j/ ]- l, Q7 c5 l
hn=hn/2; /*第n次反跳高度*/ * h9 h7 t* r: z/ k' ]7 T
}
8 } M2 B/ |6 @( e) D0 ?printf("the total of road is %f\n",sn); 8 B* A: W( q- C3 V
printf("the tenth is %f meter\n",hn);
. i! w# r* V t} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个* ]8 R, A; s/ r3 U/ J R
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下5 ^/ d6 Z" W/ W7 _% h
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。' |" ^+ u) n3 C7 N- g
1.程序分析:采取逆向思维的方法,从后往前推断。' p$ n: J A2 ~
2.程序源代码:
6 x5 f; t5 Z, ~5 y2 Q1 Xmain()
* t+ g7 g* w1 g3 N! x/ i5 D6 M0 O{& c; X3 G3 `5 p6 r+ M/ p, g* G7 X: F
int day,x1,x2;' S8 i, `3 i, r
day=9;' A+ I( T$ i% ^/ t/ C+ T/ m
x2=1;
4 h* h, l, s! Mwhile(day>0)
7 W* F( W) B, G {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/+ q J( I; R1 x5 j# `2 X% R
x2=x1;. k7 j# L, W: T$ ~( E4 Y4 R' _
day--;6 \. E0 {& W8 f& l) N/ I$ d
}3 J* q) H/ i9 b9 u( v) K2 m" _( o' Q" r
printf("the total is %d\n",x1);
# F) r9 p1 o. \; G9 ^% J}0 I3 M( Z+ F X5 Y# L
==============================================================) W' q2 m! `, x8 h
【程序22】) U6 B& E* ^# K: g3 L9 m3 B
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定. K% K3 W5 b8 ^) G( b! R3 m5 C
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
- s# H$ Q* O# x& V7 }9 y 三队赛手的名单。 8 A% n" B+ m* y
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
+ C+ `& {0 {' C/ Z# u: y 则表明此数不是素数,反之是素数。
- E C0 t r/ i/ }& w2.程序源代码:
8 @, p) e% Y" ]3 W2 Smain()# A9 g) _: e# @4 D
{
! x s+ K/ P0 k' L( \7 h- @7 cchar i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/9 [8 H* P2 H/ {4 v0 q7 a( ?7 T
for(i='x';i<='z';i++)( s5 J% O5 M+ J
for(j='x';j<='z';j++)
; R. Q0 _$ U: m# e S4 E+ h: c' _ {) a/ G$ I; U: K$ |" M/ h
if(i!=j): @! B+ n6 S* n4 ~
for(k='x';k<='z';k++)# u2 ^* n) k. [9 U6 j% E
{ if(i!=k&&j!=k)' i/ q0 A8 U8 x7 s
{ if(i!='x'&&k!='x'&&k!='z')
2 `7 U$ Z6 {, N5 x; g4 D# t printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);$ }/ L/ B* r# I6 }$ I4 V; M1 d# B
}
* J/ P1 i; r2 G1 z- N+ r3 g1 w% X& t }
% W+ @. X; e6 Y, n9 L* R: S }
, A# e! ?: X: T( a( l% X}
& B2 [( c& u' y$ G==============================================================
$ G( r+ q% l6 Z3 \ [1 H4 C【程序23】 6 H$ p7 d4 G/ }5 ?' e1 n w
题目:打印出如下图案(菱形) *0 N! z J' {" I* u/ c
***
9 g3 Q/ [8 h$ f******
/ C( t, ^2 U: r% d: X, D********0 m1 {* i2 h7 p) k, t: z4 T
******, t( L' {7 K1 p) x+ F' @! S" u
***
: U/ U# ?/ ]0 o3 e*2 w8 i7 @! K& O5 i! k8 L0 ?1 Q
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重- V B3 O% Z7 j7 m, `5 D
for循环,第一层控制行,第二层控制列。 0 v k. V% g" g# N! u7 f
2.程序源代码:
6 O6 U% l4 i9 v, Tmain()5 B$ \1 K I# U1 t% o2 N
{
|5 b, f0 w! A" L! {int i,j,k;
# k( k& O: R% W* n2 l4 |# lfor(i=0;i<=3;i++)
7 K0 I* [5 m Y {
~; V: @& Z6 y, g for(j=0;j<=2-i;j++)
8 e9 i$ H" h S2 f* B printf(" ");) ^! x7 B. r) Q$ C4 m0 I( S
for(k=0;k<=2*i;k++)
3 G/ l" }& T8 B! W" ? printf("*");
0 P, |8 b2 O4 O( N printf("\n");
0 Y- |+ o. o+ ^* I* k8 T2 w8 _/ b }: I* h. ^4 I! h7 i2 C
for(i=0;i<=2;i++)
3 T- Y) T* y3 S {9 v& u* t& u, N6 q# r1 Z, L
for(j=0;j<=i;j++)
1 _& ? o4 C& ^% n printf(" ");& \& t" o& k/ z6 p/ g h
for(k=0;k<=4-2*i;k++)7 t2 ]0 f+ M6 e0 L# h$ Y& Z
printf("*");
2 _' q4 J* w Z* M$ m' e printf("\n");! x9 h7 \4 Q1 F8 Q0 z9 U
}
) W7 B3 `& z. c) c7 b% c8 ]}( C$ I) I7 Q/ g% e
==============================================================5 R5 F" n: _# j3 C4 _
【程序24】
* u, d3 j% h& u题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
8 ?# D5 U" L' H1.程序分析:请抓住分子与分母的变化规律。
' K, G( c7 M n% X4 K* ?% H: Z2.程序源代码:
5 R$ U, o" X3 q& c; i$ l4 tmain()
4 n: l s3 I N% y+ Y9 w/ v{/ c% d& N& z& F q- ?/ X
int n,t,number=20;
" Y4 r0 ?8 A/ Ufloat a=2,b=1,s=0;# l5 o7 t! c4 g$ f$ M
for(n=1;n<=number;n++)
?2 t. i. G0 o' ^, p: p {
3 _/ q0 l0 ^ a2 R& o4 ~ s=s+a/b;/ l6 m- T n2 j9 h# p; q% a& }' B
t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
9 h0 `/ E }2 z6 ^% _8 A }
: n' [' M" h# x6 a: z5 H9 x6 G9 Vprintf("sum is %9.6f\n",s);" Q7 b% d) a- l2 j6 T
}: s+ h+ w5 q- j& f E
==============================================================& F& W4 ~, C% S. Z; L; C N
【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要* h8 d" Z# C& D0 F
题目:求1+2!+3!+...+20!的和
, M2 C5 Y9 l0 ~5 k+ t. H1.程序分析:此程序只是把累加变成了累乘。 % p. A; y, |; P9 ]
2.程序源代码:
/ O, h1 _0 \! ~8 l9 \1 z, Kmain()! ]6 D- f& u; _- ]+ c4 x
{
% m- X4 y4 G; C! J% I" H( Rfloat n,s=0,t=1;* Q+ }( d0 n8 V: P' j& o
for(n=1;n<=20;n++)
; ]( q* ^: M4 o5 ]* O {6 L q8 ? d1 ^, g
t*=n;3 M+ D7 f8 D+ m8 m6 Y1 H ?
s+=t;
s2 G2 }- j; b* h, B- Y$ }7 U, { }$ M% h9 h9 {3 H5 w j9 D
printf("1+2!+3!...+20!=%e\n",s);
+ U0 ]. j* m7 E& L3 J! _7 r$ z6 @& j}
4 b* L) v' S. J- R/ `==============================================================# W, }+ l8 l5 d0 Z
【程序26】
7 N, F& q1 ?" V题目:利用递归方法求5!。' M+ p3 C# G5 P) b* f* Q
1.程序分析:递归公式:fn=fn_1*4!1 V& Z6 Q9 J: M9 a
2.程序源代码:
: ~8 U: R8 d$ z3 M3 K) V4 Z3 q6 r% r#include "stdio.h"
& y% Z+ O( p7 u6 N. kmain()- V7 Y& C8 D ?
{5 w! D0 z4 ]# [- g) o, U# G
int i;
0 I) h$ `1 Q! yint fact();% w6 J) o/ c7 u! a
for(i=0;i<5;i++)
9 f" W) A4 t9 l: E% q; U0 C$ t printf("\40:%d!=%d\n",i,fact(i));
2 l: f9 n7 T, w- f, J$ B/ u: x# v" K}
5 W7 |1 ~# N1 N* bint fact(j)
0 B, ^4 @+ E& I, j: Gint j;
1 ]% A2 }) ^6 C1 E* K5 d( [, L{
7 J8 e2 D( x( r5 g h! cint sum;" t! J/ W) P( \! D2 v U7 U
if(j==0)4 u$ W+ C7 ~ q, C! m3 V& {
sum=1; ^. _6 V1 p8 U; [: d( @
else
" X5 C: A4 y9 o0 L/ _4 C% c0 M sum=j*fact(j-1);
! j1 S4 t. [- Z; l" ^5 [return sum;/ B' U# V6 o" J3 E- T& B$ T
}
9 m9 O3 f/ w3 F Y============================================================== - _5 H7 B8 \- K. t. ~; Q
|