【程序16】 # ?" ]% K: t; f& u4 K
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
* ]; Q, D$ [( P8 n6 w
- O3 G# t' F- T* a# @
' F" I, z/ A* s5 G8 @; s' S* Y6 v# a1 l- X
作者: zhlei81 2005-1-22 11:30 回复此发言
: |8 `$ A" [# u; H1 F. a# ^; U; b e0 w2 |, S" B( K0 V+ Q
-------------------------------------------------------------------------------- . `, [2 r" F% O& J, K
+ [! U) h2 N+ N7 P3 h# \% r4 回复:经典C源程序100例
( t: D- D. M) H1.程序分析:利用辗除法。
' a& k1 n- B+ n- ]/ l% V/ X" x9 ] V# v9 \3 z' j5 a2 Z2 ?7 _$ ]4 H
2.程序源代码: 2 m; i9 S+ |" {9 t! x3 f- A2 K
main()
: o- L2 t n* T6 ?{ # X7 H# S, ]' e$ e+ k
int a,b,num1,num2,temp;
! y7 v2 \: ~2 ]% Jprintf("please input two numbers:\n"); % H' ]4 G# O# u/ D5 C4 r3 j
scanf("%d,%d",&num1,&num2); 9 U* p% o! P; C+ ^% X, M
if(num1 { temp=num1;
+ n; J8 H" V3 s% \! Gnum1=num2; 7 u4 b# D3 X) N8 K1 O) {
num2=temp; : y% f8 v& D4 m' d# b
}
7 W0 }- S6 y$ ]" [: M1 ra=num1;b=num2; 9 p' A4 c& ~3 C
while(b!=0)/*利用辗除法,直到b为0为止*/ ! y3 F& ?* S6 x* p$ K1 S
{ * ~4 H7 E+ h4 h9 Y" C z* U! X
temp=a%b;
3 s$ f. a; N( t9 X4 Z) H% Ja=b;
5 Q; Q2 t/ ~7 U& Q/ k( d" D W4 nb=temp;
: U; d4 U! [8 v* E# m}
# y' t6 k) `$ g$ ?0 z1 o4 ]printf("gongyueshu:%d\n",a); - h3 T1 \0 @- W6 a1 F! |, m, z
printf("gongbeishu:%d\n",num1*num2/a); . _( ^( X1 y" W# P6 U* X4 }( O
} ' R) C4 P$ i( g( ^( Y6 l1 l: Y
==============================================================
: }' z/ g7 Q3 \& V* d. y2 a7 r1 j【程序17】
9 q0 n: J$ s8 A `# K题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
: {$ b; b, v$ H1 t: f: ^7 Q1.程序分析:利用while语句,条件为输入的字符不为'\n'.
7 z, B' b; E" B3 B6 J" i8 n( U0 u! j/ q( K& i% m% V2 F# A! [" w
2.程序源代码: - N5 A: a. y2 p
#include "stdio.h"
0 _# u9 i5 D9 O7 v, d2 [main()
; U6 L; y, _- G3 _( X' [2 ~9 [4 ?{char c;
4 x" o5 Z# t1 q* s8 U/ lint letters=0,space=0,digit=0,others=0;
% C' `! s6 _3 P- Q! c' A' k5 g* Rprintf("please input some characters\n");
) G' @6 ?1 q$ Awhile((c=getchar())!='\n')
Z, `) G9 z6 b3 h, ^( \; y p{
$ w2 m7 Z2 }9 ?, U# Y/ }3 P! w7 b6 ~if(c>='a'&&c<='z'||c>='A'&&c<='Z')
! O+ |2 z5 `8 G8 J) K! N iletters++; ( H7 X/ D# G6 U
else if(c==' ')
7 X+ z/ |# a ?/ ospace++;
% _: Z$ o& `1 Z, I3 H6 melse if(c>='0'&&c<='9')
& _4 D9 `5 ^. D6 h. J3 F8 |9 gdigit++;
7 e7 N# n( A- X. kelse
; C" m" t/ C5 ]others++;
& b5 H1 f0 m0 p' t l/ M}
I& {* x6 {% E9 S. ?, K7 E. Bprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 9 P' X0 S- L5 A& r9 P0 z( S& \
space,digit,others);
8 i* }) v; x z}
1 f; R1 T: m8 q% E. h" A+ z==============================================================
- G5 W% }7 ?: d4 r& f【程序18】
# o" r" g `! c+ G题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
: h/ _0 i$ i) L) o; G1 i) X共有5个数相加),几个数相加有键盘控制。 9 k2 U3 h1 R8 F/ H; x8 f: |) ^
1.程序分析:关键是计算出每一项的值。 " B' Y/ H# [9 {6 D1 Q/ D
2.程序源代码: $ D# z, q/ F f% n3 I! m Q& L( ~
main()
3 }0 e5 J/ x# \{ ! J; ^4 U Y4 F+ v* H
int a,n,count=1;
1 j5 n s* f& U7 Y2 }long int sn=0,tn=0;
7 F1 b' t3 d+ [/ |printf("please input a and n\n");
5 D q8 X- e4 O! e! S1 X& ]scanf("%d,%d",&a,&n); % W1 N/ p' i& x2 L: ?9 e( D
printf("a=%d,n=%d\n",a,n); ( N4 ?( N( [- `) j, F
while(count<=n) 7 b* x, F; |' ~' t
{
, x- u) z, s, g' o( m% X& P1 btn=tn+a;
Y+ t0 o4 {9 K$ u: H8 k" lsn=sn+tn; 9 ?. V! d5 ^: t: G% [8 x o2 K, \
a=a*10; ! ~8 F* X7 X* G
++count;
6 J& i! h+ M; {5 e1 |9 Q- `8 ?) D" F} 0 X% B( B3 O/ {( P9 S
printf("a+aa+...=%ld\n",sn);
8 B6 @) l0 l ^0 d! E} * P# k# N/ e5 z" a8 V. `1 a: X
============================================================== + f" o/ J, G0 g* w$ q, X E
【程序19】 1 \* y& d; N7 K/ B; N7 ^/ _3 C. n" H
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 " w5 B5 R* x! U8 l0 `6 S
找出1000以内的所有完数。 0 z+ s3 T) T/ F6 o7 ?# s
1. 程序分析:请参照程序<--上页程序14. 0 H2 P8 \$ {7 f" C4 L
2.程序源代码:
& T7 `" O+ U- `: \main()
% A) O) p; t5 F% L% S% D* n{ - p4 S" Q; F P: Z
static int k[10];
0 N7 T+ Y) y+ S# M* ?1 M& k$ Iint i,j,n,s; 7 R" D* R& f; B3 @" `) N
for(j=2;j<1000;j++)
1 N$ m3 k! n; V% V{
6 N& d8 n1 A! s1 j3 _n=-1;
% o) G2 l# f1 j$ I( _2 p/ Y9 Ls=j; - m7 ~0 e6 T9 L4 V4 E5 g- ?) d
for(i=1;i { / ~6 @3 ^- f" v
if((j%i)==0) 3 T, K" |+ C1 p' ?0 C' N/ p7 @
{ n++; , F/ i2 i9 |; q7 F \$ ~
s=s-i;
% ?" E ?% b4 G6 `k[n]=i;
2 q$ k. r1 D4 G2 K}
7 j5 v, ~! `# ~6 v( Y$ F}
: c0 m( A& r- J1 O; }7 bif(s==0) 8 P6 ?8 ~: W; w7 a& v% \& N
{ * j2 p. Q9 H$ F5 v5 P( \1 k
printf("%d is a wanshu",j); 4 F! J& b9 z0 x" f% ~- Y% G
for(i=0;i printf("%d,",k);
+ e7 K$ l+ G9 g; U+ i& ^* c# J, m8 Vprintf("%d\n",k[n]); - J! A3 p/ f+ f
} % L% { I+ n/ K
}
) l N- z2 R% r* ~, O9 B} + W l9 T8 N+ i8 P1 S ~
============================================================== : |# ~! W% x! T3 _0 u5 p$ m5 u
【程序20】
2 o5 E; h! C+ ]8 E& ]题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
2 h9 {, N% x* e. E2 M, p第10次落地时,共经过多少米?第10次反弹多高?
" e& f& ^5 o; d1.程序分析:见下面注释
6 W3 g% J+ \& B: e7 s2 l2.程序源代码: ; Z& y9 g/ D N* X+ ?, c
main() - J' y) N2 _ U) B
{
* \/ ?& h. }: H% O! pfloat sn=100.0,hn=sn/2; - }5 K& h( s) t
int n;
. U# I V* K' k% [" K4 gfor(n=2;n<=10;n++) 7 t* _0 Y. }; o4 |2 l4 C) K# v0 N( n
{ " p/ i p: j) Q$ W) p
sn=sn+2*hn;/*第n次落地时共经过的米数*/ # s) l/ y+ y8 c. g( f+ O
hn=hn/2; /*第n次反跳高度*/
0 B2 q3 J' R4 z+ B) U: c0 l} ' a/ G) E: h$ Q ]- `3 e
printf("the total of road is %f\n",sn);
0 \ \- Y. C# T' V& v4 x0 G7 ]5 l+ m1 V) Pprintf("the tenth is %f meter\n",hn); : u: d( ^1 Y( R) l$ ]
} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
+ S G% B1 y# P3 b% U* f 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下( S4 j0 B1 m) y! ~
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。5 l) C5 t+ D4 k% S
1.程序分析:采取逆向思维的方法,从后往前推断。
8 s1 |( f. u9 _; n! p+ y3 C; b! {2.程序源代码:6 E. K, R0 E1 s a
main()# R: R. j9 T3 v z- k& w# D
{; ?" ?1 x1 W/ L2 j) L4 v
int day,x1,x2;! f) U6 L, f) Q7 f8 J# u% E9 {8 O3 [
day=9;. G5 [9 h7 I. g* @, C% h M F
x2=1;1 ]2 }; e* |7 Y8 b/ K T" O8 _
while(day>0)- R4 O; c! h0 h: x& e# r
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
! G: ~4 D( v& Y/ Q9 P: o! B5 U+ l x2=x1;6 s t3 H" q% P( t% S2 H4 J
day--;
& x: z8 w3 u5 S }
( p% ?) d$ ?* C8 L# w) a/ B9 ]+ Mprintf("the total is %d\n",x1);
% L) _4 S. \6 t5 N Z7 c}
9 ?- i/ U) u4 L4 X5 U==============================================================
! I Z3 k$ l( V& R' g) Q0 M【程序22】
" K) G2 j7 X3 n. x9 a& l+ l题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定) @! {& Q8 C6 `# L- C) ~
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
. G8 Z L7 O: M6 ?& `2 d 三队赛手的名单。
8 e% `9 F$ h9 O; H1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
/ t3 C- x/ U; b 则表明此数不是素数,反之是素数。 7 F& m& v$ {, L
2.程序源代码:$ Y& U3 U1 M. v" d1 ?1 H& g
main()# j# W' r! I" o" Z
{, T2 q; u- f, } |" z" W
char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/
+ b: ]3 x0 N' G8 xfor(i='x';i<='z';i++)
2 [% q& x7 e K for(j='x';j<='z';j++)7 {% G4 l) Y1 R# O! [3 S
{" h/ d! g3 I8 Z6 L
if(i!=j)
. K) c8 Z0 J* z0 U3 n for(k='x';k<='z';k++)
0 |4 f, y5 k6 n# @( n& r6 t9 v0 ? _/ J { if(i!=k&&j!=k)
- a1 H' }) k) ?& y { if(i!='x'&&k!='x'&&k!='z')- m. e; T ]# ~
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);# n% N. n. u, q
}
/ T! h. Z2 S/ F' G }
( y l4 L3 g$ y% a( r5 W }
/ u9 j6 ~2 z. \- p}5 i# F3 ]6 i* b8 g7 j0 W& P" w1 E
==============================================================! j$ r" R @; C& X) f+ T. P8 [
【程序23】 $ C3 ]' W( d' F* _* b- p! w
题目:打印出如下图案(菱形) *
+ x% u% W/ R2 O, T. Q0 _2 t4 c4 f***
. c- T9 o1 U0 w1 f9 D******2 J. A. r7 E: v- Y" J3 Z8 x
********& J) |, Y5 B+ f0 d7 o; p8 D0 G3 c
******
1 D4 b, ?6 d# G: n4 e/ w***
% a' c+ T+ X# C/ O*( k; K. }( {& @, K, K) T4 e
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重" [, N. R( s B- X' J
for循环,第一层控制行,第二层控制列。 . H1 \3 y4 w: f' j7 B
2.程序源代码:
' [8 t8 y) }* I6 G$ Zmain()
" R0 c9 ]& _# u/ {% j{
! U3 ^" B& y: p+ g- nint i,j,k;
; w4 q/ e( W& d- k/ q+ z' {+ E% y4 pfor(i=0;i<=3;i++)
# D; D- |# Y% ]! p# Y V D {1 o( x1 n. p6 }9 @* D& q/ V
for(j=0;j<=2-i;j++)+ K I$ \; _; H, k/ l/ D* Y
printf(" ");, A0 o5 s2 P+ Q" L
for(k=0;k<=2*i;k++)
! R+ K* ~7 a, ] printf("*");
7 I0 I0 R7 O1 b2 }* O: h printf("\n");# n9 t, b- z+ E
}
6 Z* ]( w6 b# P9 ?for(i=0;i<=2;i++)+ s( [; s2 | w1 ]
{
) e) i1 i* e2 z* B i( P9 u for(j=0;j<=i;j++)
& c/ r$ O' ]# G5 e. H+ \% n printf(" ");+ t# D% B; R) i$ _1 F: S( ~+ n. k
for(k=0;k<=4-2*i;k++)
* j7 S9 L& \8 I& Z; X' f7 _ printf("*");
0 h* h L \8 S printf("\n");. g8 F$ S* X- u
}
& z. l# e$ |3 o. N" M}
4 W9 o7 e7 ^$ W3 w1 ^==============================================================
& H& V7 k% \; W( y" u【程序24】
' a! V. l+ g) P4 o题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。9 w/ d0 @- {# h* K6 F; N( G/ N
1.程序分析:请抓住分子与分母的变化规律。
4 V4 U: H1 Z2 s5 j2.程序源代码:
3 o0 a1 L. j' i% cmain()( {. C. Z; m5 T i% K# R
{
" b7 P1 I5 Q$ |4 P0 sint n,t,number=20;8 F: \; m; U2 b: L/ B3 {, c
float a=2,b=1,s=0;
: i/ r9 ~- u0 ~for(n=1;n<=number;n++)
# M. r' ~6 W F \4 i8 a o {8 `9 e- f- X1 }8 _: a
s=s+a/b;9 `" ?$ S! L3 s' N. u8 c
t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/7 E! ~& o+ `% G% W* G
}) e9 i2 u$ N$ P, [! z1 k
printf("sum is %9.6f\n",s);1 Q( W4 [+ W6 H C4 v' H3 R
}/ V$ B# l3 Q% E' w7 R- ~
==============================================================* J1 e9 x: c" V; g; X# p. q0 _1 n
【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要* j9 ? y0 h+ @" g D
题目:求1+2!+3!+...+20!的和3 a& O$ X. `+ W( t8 ^' c: m% z0 n
1.程序分析:此程序只是把累加变成了累乘。 $ E( T% N, d* @8 {6 a8 e# c7 Q( R
2.程序源代码:* f9 p9 X7 g& \# B% d r
main()
& p8 f$ x' K' V" G& |% F4 {* H. M: N{
6 Q" L1 `" X3 v+ ofloat n,s=0,t=1;
/ V3 v9 ?- L% t( I' \0 zfor(n=1;n<=20;n++)) Y" m# C8 r" P" D' E8 Q8 h9 e
{2 f( |1 b0 A, i. s. c. l. ?" N
t*=n;
/ k2 G; I; `" G' |0 m. U# R s+=t;# e, v4 i5 m9 i' A
}
; ?. U- o& F) L6 Oprintf("1+2!+3!...+20!=%e\n",s);
2 c2 S- @" `: B$ J}) X+ n! M, x. U; i2 ?3 }$ h B
==============================================================0 A- t* m" M( |, z
【程序26】 " q- j! I7 X$ p+ J: T# O5 [
题目:利用递归方法求5!。
# Y* s. Y$ F( j2 \. N* Q* g1 g1.程序分析:递归公式:fn=fn_1*4!
" ]9 H, e/ H6 f0 o4 x! d' H8 R2.程序源代码:" t* P3 ]4 D9 i" Q" B( z0 e
#include "stdio.h"
8 G+ q/ [% T6 @2 i, \, q2 Q1 Imain()
. g) \# i# W8 i H% ^: K2 y{
( M7 m: T7 u; k2 }* L$ [8 Qint i;9 \+ z1 W* ^+ [
int fact();
; V2 {6 m7 j& c6 d- Sfor(i=0;i<5;i++); Q# ~" L4 U7 r9 z
printf("\40:%d!=%d\n",i,fact(i));/ M8 m9 S6 r: Y# W& ~# g
}
7 R, n, I. h* R0 C+ k5 n# ^int fact(j)
9 k; K# Z! H+ _int j;- _7 [; d8 U2 O0 t+ ^
{
1 [/ } _% ?1 v9 A9 r# wint sum;& j8 v, b# P9 |! S/ L, ^5 q8 C6 ]
if(j==0)- S% _& |4 p0 L: N& G' Z( p$ K. R
sum=1;
4 h8 a1 j6 Y5 q+ telse
* v$ U' T) Y5 s sum=j*fact(j-1);5 O9 c- n- d! f( s% H
return sum;
! ?! X! J6 y$ @7 P}8 v6 A( D, G, K5 i; L6 Z
============================================================== # `# Y# T, n# k/ X
|