【程序16】 6 K, G0 d S2 {2 Q; ?3 |1 N
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 : ~% X7 |$ c* i% }% S a
0 t! _) s- a& R( N/ i+ _
$ A/ G |+ k, j) p) I# V; U r3 u$ G* f: Q: ?' f: U4 |! s
作者: zhlei81 2005-1-22 11:30 回复此发言 2 E2 Q# l, E3 v9 \3 Y& n- \' _
|5 D6 X3 R* b& [7 X5 j. V-------------------------------------------------------------------------------- ) Q+ {0 v# s# W- t
6 N6 i. W( S9 s$ p' d' {
4 回复:经典C源程序100例 6 f) B- o/ b# y6 d3 n
1.程序分析:利用辗除法。 8 w/ X) v* J8 N. \/ u" `& N- T0 p
9 ~" U9 M! n# q9 p1 ]2.程序源代码:
2 @5 v1 T# B. A# e, {4 g0 ?+ J0 omain()
( e, S W7 B; [{ 9 U- N8 }. @3 `9 A. F
int a,b,num1,num2,temp;
9 m; g/ y: w) vprintf("please input two numbers:\n"); % n8 J/ C. j: z: p$ @2 @
scanf("%d,%d",&num1,&num2);
' g$ p, m+ _: p0 Q( F$ m6 aif(num1 { temp=num1;
& g0 h/ H3 ]& d9 p" nnum1=num2; # M9 X! z S3 t& t0 \
num2=temp;
; @4 p9 p2 r+ I5 K} # L0 @+ a$ s1 }1 ]5 G
a=num1;b=num2;
: g4 x i7 j; ^5 \1 W% x ?- ]3 b' Pwhile(b!=0)/*利用辗除法,直到b为0为止*/ $ O6 M9 q) E9 K- O9 X9 Y6 @
{
6 Y8 @7 H$ d$ H8 {1 q6 W/ E( ctemp=a%b;
7 g9 L0 D1 W, A0 p2 fa=b;
, L& v# g$ g1 Z" Y R% r8 Kb=temp; & B8 R5 }+ ~1 \
} $ [8 z0 Z- d' S+ g' a
printf("gongyueshu:%d\n",a); * _' l4 f. _: I/ P! u1 w
printf("gongbeishu:%d\n",num1*num2/a); & r) Z' K" Z9 {; Y
} ( o- @: G% X) M: F- z: X
==============================================================
9 T& N4 m6 h# }. R" l. u, ~+ [* P【程序17】
8 E. h3 W0 N& T" ^ l& C% A8 }( \题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
8 b7 y! D7 ^ \) P1.程序分析:利用while语句,条件为输入的字符不为'\n'. ! p3 Q# L0 X7 f9 ]4 J
: u& z4 d+ D1 U+ x5 M* ]; e% }2.程序源代码:
: E) y* F; i+ u$ D+ `) w* c#include "stdio.h"
, d& a% w' s: R3 c n- x/ wmain()
0 T1 e' ^6 R8 ?{char c; 9 P& P7 O* a: W
int letters=0,space=0,digit=0,others=0;
F% I! v+ V* Y: Y- c0 Xprintf("please input some characters\n");
; }& _! d$ v7 K1 u( jwhile((c=getchar())!='\n') " U7 _% J' X9 H. K ?
{ " U( M+ L% M. q x
if(c>='a'&&c<='z'||c>='A'&&c<='Z') 8 d- l2 Q. i2 A. S& s l
letters++; 6 V( J& B$ r0 ]7 T- M; V
else if(c==' ')
" M7 f5 j: x1 U- y/ `* Ispace++; : N( ~% d% ^3 z- A( L5 V: x
else if(c>='0'&&c<='9')
" D5 B6 G% [6 @8 X G/ h: L) ddigit++; 1 }* r3 k6 G# Y1 o
else " l, Z+ S6 z0 ~- g6 {1 j& V
others++;
1 ~& n6 n& |2 K, S* c5 R}
\, o' {$ \0 n" wprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
' ~5 E' y" A: Y/ }8 j) ] fspace,digit,others);
) u5 X& g, G* y5 n8 f8 B# s+ |} 4 e' e7 k4 ]5 i& ]4 Z8 g) T3 F2 [4 y. f
============================================================== % J7 R' D0 w: A* G
【程序18】
' t. m% S& O# M3 k题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
2 z+ ~2 p+ y9 G共有5个数相加),几个数相加有键盘控制。 2 k; O5 N* M% T& ~
1.程序分析:关键是计算出每一项的值。
' Q! _- k" u; [, d* R9 z2.程序源代码: ) P# j/ ?( O6 x8 |- @- f8 p
main() ; S% [2 O% L& V* t! Z9 ~: q
{
* L0 z+ X- T( C% F4 n Aint a,n,count=1; * V' ~9 ]. I1 B. h# J
long int sn=0,tn=0;
# s0 w" G8 ~: u/ Hprintf("please input a and n\n"); " O- N1 I" i, \6 U+ O
scanf("%d,%d",&a,&n);
0 A* ^* `+ }0 _& n, Hprintf("a=%d,n=%d\n",a,n); ( M& N2 |; C1 J- j
while(count<=n)
# I7 Y3 l1 d2 H/ a{ ) A" E* j+ F- C
tn=tn+a;
: ?. o7 c3 W$ T& s% d* q6 bsn=sn+tn;
- @ A% B3 {' ka=a*10; ! R0 a; ^3 G; o8 k( ^' z F8 V' S3 C' L
++count; " v2 W" m ?8 X( Q
}
, Z1 T0 u7 ^7 E B4 [% u( T8 Lprintf("a+aa+...=%ld\n",sn);
8 q+ Y9 f1 z# W2 ]}
1 j% g) l2 u' Z============================================================== $ [% D5 Z/ x. x
【程序19】 & v1 t( A1 _' j, C5 }7 Y* \
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
4 @( V! q0 @3 p& M# Q找出1000以内的所有完数。
3 u) v9 B2 e! F7 l5 p5 y0 _1. 程序分析:请参照程序<--上页程序14. : g3 ^2 D7 [2 ^. f- A# p
2.程序源代码: # D# v# G( {, W) H, w8 g0 y
main() 7 S% q* G4 c6 I: M) V$ c k' _5 c
{
2 L2 O* V! l) l! ]2 w) U& b$ p8 mstatic int k[10];
- B# u, t+ }# ^ i$ Z6 ?( aint i,j,n,s; & u( n: t' d4 f1 }! b
for(j=2;j<1000;j++) ; v$ u: A% g6 ~9 Z; g4 O3 o
{ 2 m0 h' }4 @0 e; K
n=-1;
# |. U0 I# F: j$ e+ R/ O! Xs=j;
$ |& l8 r" x! yfor(i=1;i { , @4 }! U, E7 M" H( d ]+ h
if((j%i)==0) 8 A9 ^$ S0 R& L6 z
{ n++;
1 ?* T4 {6 r% c6 W3 is=s-i; + F* r. | y& A
k[n]=i; # }! j8 C4 D' Z: v* z
}
' }& U8 O/ x0 q' |$ T' k} . N- J8 X4 v y3 K/ q
if(s==0)
0 P1 M, s# x7 U7 w6 G7 L{ 2 G7 b x+ O, d0 v; C/ G
printf("%d is a wanshu",j);
0 e4 ?* U' J" a# _9 {- Sfor(i=0;i printf("%d,",k); 5 u @' x# f& u0 A5 X
printf("%d\n",k[n]);
8 d2 M, J% `% B8 A2 Y g}
" i+ E8 x& L2 U) a: {}
4 ?9 y5 v0 c# Y& _+ D}
) O$ |5 V' x7 L============================================================== 9 b1 n) q( u+ j: B4 z1 }: u C
【程序20】 # O! B8 ^3 d5 W3 [! P& i
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
* A8 o# U6 B$ ^+ g' h9 Q7 g |0 X第10次落地时,共经过多少米?第10次反弹多高?
. R) n) v/ E7 l$ M# k2 C8 U1.程序分析:见下面注释 / i: {( F. a! ?8 X! z6 ]3 W" h
2.程序源代码:
5 H6 _2 J. c( Y8 }, wmain()
; F# y2 a& Q4 {% Y- j% R{
]4 k" z" q# L. X* R9 a& ?float sn=100.0,hn=sn/2; ' X) ?: s4 Z i0 M% I
int n;
7 g2 y e( K- `for(n=2;n<=10;n++)
& D6 s/ P0 R- x" G0 O0 o$ p1 D$ D2 A{
+ V) d* R4 w2 V3 z* dsn=sn+2*hn;/*第n次落地时共经过的米数*/ 5 c9 f: G+ t$ n7 H, w
hn=hn/2; /*第n次反跳高度*/ & z# @" _. ]7 t& |
}
( i+ x% I% B0 k6 i% _printf("the total of road is %f\n",sn);
% Q# `+ W" e" y! B; b4 h" L& mprintf("the tenth is %f meter\n",hn); " G' D" R3 Q& Z3 s& K4 n% s
} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个$ x) |0 C! ~7 A
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
1 z* o3 ^" f$ S 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。7 s# q* I, h( C6 ?2 C' }* o0 A
1.程序分析:采取逆向思维的方法,从后往前推断。
! f6 o4 P" n e8 M' P' ?( t7 V. O2.程序源代码:. i! d& {0 f7 J1 E! J
main()
2 ^! x( S/ T8 p$ t( d{# u7 ~8 J7 K; e
int day,x1,x2;7 F$ {& U2 Q! w+ T" k
day=9;
& m. B1 f L' l5 Ix2=1;! @. c! _8 |7 u$ ]- C
while(day>0)
; E3 v! y5 K) ^4 E! l {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
% q% l4 I9 O5 E) R5 R7 ?8 i x2=x1;" b" p' \, C( ]6 ]0 C! D9 e
day--;4 |2 V9 ?/ Q$ m' ] J" a+ e4 f
}0 F8 }+ V$ |$ a; W+ P
printf("the total is %d\n",x1);
1 s8 T( p' b/ y5 B7 M* O8 T}! [' I7 A0 b6 N9 N3 g8 g
==============================================================
, I' C% a9 K4 Q; Q8 q; l【程序22】4 a$ L P! i( T, k/ M+ P
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
0 M$ O. {# a1 Z/ R 比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
3 W8 K- q# Z' V' @6 z5 I1 S2 i6 \1 B 三队赛手的名单。
. y( C$ S) V, R" l1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,5 _' U! m0 d4 S( T7 J
则表明此数不是素数,反之是素数。
* M; L/ m H, y- D7 C6 V0 ?2.程序源代码:& v4 x& J; `+ p8 R' x
main()
) x. ^* t3 g( D0 b8 P( y1 n{
: }: m7 q8 D6 e1 ], c0 kchar i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/
k* S. P4 @ jfor(i='x';i<='z';i++)" t) l' M9 B! W$ Z# B( S9 I
for(j='x';j<='z';j++)
& T$ o" F( _3 [' Y+ S {8 X: M$ M9 h4 W' {: H9 R R$ ?
if(i!=j)
7 z. X9 Z* \2 \4 W% q8 j for(k='x';k<='z';k++)0 h( T [' P" j- q( J3 Q, E" g
{ if(i!=k&&j!=k)
/ x. R) [, I. I% n { if(i!='x'&&k!='x'&&k!='z')" x- V2 U/ }8 i2 X" j
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
" s. ~- X/ `5 v" V: M } v8 U/ z6 A4 a( K3 t/ A
}7 U' F# l N/ y# t9 R, }! n
}8 K. F6 n5 ^4 r' v: v
}
, e! R: Q* i+ w6 `- y==============================================================
% w; x6 q1 b( o7 S. l3 i【程序23】 2 a0 [1 x4 v6 L+ G# b. j
题目:打印出如下图案(菱形) *- U- S1 U7 H. F$ g
***6 }: l5 {% ~3 e; I* @- }. ~
******
, l6 J2 U2 L+ _$ y********
2 u* T+ f. z5 O******
$ _2 ]# a6 w3 g**** I. X7 J' c8 B
*4 t4 m! T6 g! u; U& {
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重$ z g5 X' N0 V9 Y) B
for循环,第一层控制行,第二层控制列。
8 |* E4 d* x. t, i2.程序源代码:
2 @2 l+ G, ?) k A( d/ L: D4 [main()" n6 g W W5 E/ e+ o1 G/ w. b/ I
{/ J% ~3 H* i$ m3 s$ P$ |" `
int i,j,k;! j( q& D6 l: H# G
for(i=0;i<=3;i++)
8 m2 u4 |5 z8 p8 I {# ]1 S7 X d, P. j" w% C
for(j=0;j<=2-i;j++)
" }# n, ?9 w! ^& y1 l# Z" }, W printf(" ");5 M ^! @0 ?# G% y; J$ o! q
for(k=0;k<=2*i;k++)
' ~& _. D; Q+ o) ^9 ] printf("*");$ L3 ?4 X, |* X% C2 t, Z6 h
printf("\n");; J" ?4 ^. M! Z, Y4 v+ A
}5 V& x$ p1 @6 C
for(i=0;i<=2;i++)
3 x# {0 u4 r9 K0 L7 I {
& B) M/ e% i! m( y for(j=0;j<=i;j++)' i- A# C) B) ?$ U9 k Y6 Y
printf(" ");
, Z+ [+ o) d( t5 t% D& E i( x% [ for(k=0;k<=4-2*i;k++)) [; {" v5 Z3 x; x9 V9 H+ ]
printf("*");
, A) ]8 H1 L6 n6 a( I printf("\n");
/ M5 k' A5 k: q: T }) K$ N! ^& e% E/ k$ E: G i
}
# S% G6 g) F/ m==============================================================! [+ |8 |* ]. {4 R1 n& {$ o
【程序24】
" m5 h$ v z- z8 B题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
# ]8 c# S; p5 `2 Y1.程序分析:请抓住分子与分母的变化规律。 6 S" t, `1 C- F& s( _
2.程序源代码:
! J, S1 S' u( q% m6 ? ]3 gmain()
& P2 k( c X& ]4 j{/ H" J+ r. R8 I( {
int n,t,number=20;" `! S$ E; m r, a; X( u
float a=2,b=1,s=0;. L( ?' C! h y3 g5 M8 F; g* i
for(n=1;n<=number;n++)
6 i/ W0 B& U0 c4 y! K+ J {
: p; x0 Y) o) f; t Z s=s+a/b;
# i. U5 [8 [0 j$ @+ f+ Q7 B0 u t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/. V, ~7 C+ V4 W' C e# h& U. _
}2 y) J5 N) O8 T0 C" j: [3 c
printf("sum is %9.6f\n",s);
6 m, R. l" J; q0 t% j}
) k! P4 `! n, S! E==============================================================3 r" ~5 p9 l0 J! H4 G
【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要* W2 ?" {/ K4 }" E
题目:求1+2!+3!+...+20!的和
0 t9 [; E% o) r/ p7 \! k1.程序分析:此程序只是把累加变成了累乘。 & {+ z* L8 U2 h" c4 q3 i3 L3 v
2.程序源代码:0 e+ W8 d% T6 _' | |6 n
main()& \7 ]6 Q6 M) \; R6 Y
{
$ C- v. o8 e( m/ ]' V3 e! C5 cfloat n,s=0,t=1;9 Q* z& g# r+ N6 [3 `
for(n=1;n<=20;n++)
6 C1 z( o7 r9 `3 L {
" F) x$ Z3 ]3 s# n( J! j- | t*=n;7 j, e% r# A! Z3 r7 y
s+=t;, {- h7 W- ]% U, _! }7 L
}
. ~! H. a9 u2 k7 S, T$ sprintf("1+2!+3!...+20!=%e\n",s);
. n# C# A3 o0 p}
7 C6 W* O7 J6 P==============================================================1 |+ a. T! Y. k9 Q7 D; M }5 s1 e
【程序26】
$ M" D, J( x w题目:利用递归方法求5!。
) k |+ X; F( }* Y0 l1.程序分析:递归公式:fn=fn_1*4!
2 m. m/ Z! @; J0 }- C1 @* L* p2.程序源代码:3 j" d* v+ n2 }
#include "stdio.h"& Q$ \0 A5 B( K4 I
main()! k% W$ P8 K) ~1 U J
{
% q; G! o5 Q, Q* pint i;% R9 _- Z$ I) X9 A, G0 s( Q( I
int fact();
2 w* A" v0 j: Q% x' nfor(i=0;i<5;i++)
1 u1 p0 G7 _, r4 \4 Y printf("\40:%d!=%d\n",i,fact(i)); B8 s% w6 z4 Z
}& D {0 E' H, i) x' r" h
int fact(j)" Q( O3 y- Z% |8 u# x; _& X
int j;4 u. J3 W7 |9 o$ j4 M1 U: j: g; j
{( p2 ^( ]& u/ s8 l
int sum;
" [& l+ p- e/ M8 J2 l2 Sif(j==0)
% W2 w& r& u" F/ {; g sum=1;- |/ H0 f0 t* n- p
else
) N0 l1 l, P$ j% d( a( w& d! b sum=j*fact(j-1);
" d4 E/ Q- i8 Z' l& J# O) m8 X' G' h, qreturn sum;
! [$ v! w) H" C( K8 d8 [}
6 z, q" |) w6 B5 x+ Y! s8 x# T! W==============================================================
4 q, _' W2 r: l7 R- f% r |