【程序16】
1 X7 w& s/ E5 m9 c. B' Q题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 : b% y7 G2 |: g& n$ f6 A
' ?/ Z5 G1 J5 z; E& k/ i" _' J
' F- U) L7 L' i0 o5 _
7 C4 L0 ?* b9 {) r作者: zhlei81 2005-1-22 11:30 回复此发言
# T' e' E+ m* h2 f
# A- z; x. h% Y) t' k0 U) _& W-------------------------------------------------------------------------------- 8 o' ]" u" B- q( X
2 @0 b' f& v: w
4 回复:经典C源程序100例 " `6 A6 z' x; X# n& p
1.程序分析:利用辗除法。
, i3 n1 r& J0 M% P* _) E% C6 N4 B% v( R% L
2.程序源代码:
: Q3 s1 Z) W& C5 emain()
2 E1 J% U3 v" V' X{
$ T1 h6 @$ c) `% u! a- Eint a,b,num1,num2,temp;
$ O2 R1 S- I$ e5 q9 x4 iprintf("please input two numbers:\n");
! }- m( U* ^8 \+ [0 p# u1 ?scanf("%d,%d",&num1,&num2);
0 a% ~) e8 P' T& M+ \8 e7 Sif(num1 { temp=num1;
. F4 y( J3 k, \num1=num2; * c& B1 B0 c# w1 v9 g
num2=temp;
. H* t* w* @+ w$ T7 w% Q} . n b! {* m/ U8 P* K
a=num1;b=num2; : r- h6 |# f+ H4 k3 O; n o; V
while(b!=0)/*利用辗除法,直到b为0为止*/
/ ^6 Y- C* M/ w: \* y( i% O{ * q: s4 t; L. E {, O& m0 W
temp=a%b; ) P0 {0 N7 U6 q6 u, m
a=b; " z) D& D. ]/ L9 [) F( {$ ~
b=temp;
7 |6 ~. ^, Q9 _- H8 ~} , j2 z; H# z6 y5 h; {
printf("gongyueshu:%d\n",a); . \+ o, Q$ R% h. v! P% ~
printf("gongbeishu:%d\n",num1*num2/a); ) |$ j8 j2 i2 C" L7 @+ \5 H% g' @
}
" m& {& d$ {) u6 \. O* V============================================================== : ~# K! N8 N+ m7 d8 V7 N8 ^5 A+ M1 }
【程序17】
7 d" c( E& g% N% x- j题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 $ {7 u3 J7 J, j8 `
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
~, w" L; a5 R) X! P% D7 d2 k6 J9 T" f0 F& g
2.程序源代码: 8 e1 y9 U) i. L5 n: S
#include "stdio.h"
0 u7 B- y5 Y7 e5 rmain()
0 i" ~; K K; L8 d W' u' ~{char c;
" `0 ~7 y3 m4 mint letters=0,space=0,digit=0,others=0;
8 L6 |5 e0 k k4 [. ?& dprintf("please input some characters\n");
' _* J, a8 n5 V( g) `1 pwhile((c=getchar())!='\n')
/ O1 u) c6 k# r& o1 R9 ^{
4 P2 h% }: ~* B$ s2 D4 S/ _/ z) gif(c>='a'&&c<='z'||c>='A'&&c<='Z')
( V8 _4 y- U% ?( J, Sletters++;
* k Z) X- A* d+ V5 ?. ?* @! V: selse if(c==' ') ! I7 x6 i, n. E: ^$ h
space++;
' @" l5 r$ K9 f( P5 X& n5 Zelse if(c>='0'&&c<='9') $ D+ ?- w3 |1 u6 V8 {7 }& j
digit++;
5 r( ~0 Z1 f0 E& s1 Welse
% v+ N( k/ A! \( e4 Pothers++;
1 O3 W# u8 w0 \9 x( N" P- T" U} 8 e+ p5 `/ w, \) g& `; b
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
" C- Y. D7 T$ |3 l* Fspace,digit,others);
) o7 O0 I0 A" n7 x6 F' j- f} 2 U6 I& H' f- P! c. V/ ], C
============================================================== + I8 x8 j: h0 q( Q0 d& H7 [
【程序18】 . C1 _# B. Z+ J* E! X; P& f
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
% X) w0 Y* `: u X. I0 r5 b1 r/ v) [共有5个数相加),几个数相加有键盘控制。
- V! z: H/ d* a0 M: n: c9 @& S1.程序分析:关键是计算出每一项的值。 2 T+ C' r0 a; a' h
2.程序源代码: 7 |/ G7 ?% R& m7 Z
main()
6 [" L9 R- v* y" Q& G{
: M6 L7 k% Q& s( }) _8 o* ]" Fint a,n,count=1;
( A; {( B0 ]& [% w }6 slong int sn=0,tn=0;
2 |4 k7 \# I1 b; n# qprintf("please input a and n\n");
3 R2 {) X3 y& F+ S5 `9 `scanf("%d,%d",&a,&n);
4 T0 A. |$ S, { |( U) }9 Y9 u% {printf("a=%d,n=%d\n",a,n); 7 q$ `" w. K3 P& b# H% n" \9 x
while(count<=n) 2 F; \' Z0 R& h8 f* ]# Q9 N
{ ) W) i* ]0 Z, Y R# U
tn=tn+a;
* q1 D' Q4 r. i( y4 c8 Ksn=sn+tn;
9 m6 {# ^1 L% N( J8 Ga=a*10;
* D( L' ?9 l; o/ h# _" S# Z++count;
$ ]: l* e2 z: O: c# y2 Z, J9 l7 r}
! r9 I( Y/ ]2 C" g' |' N3 Iprintf("a+aa+...=%ld\n",sn);
/ l) C; j5 v* ?& o; c0 S, T; z}
: ]6 M( Q; ^7 q! f==============================================================
4 [/ u6 e3 ]6 i: ], Z7 l. u【程序19】
- Z' X, ^4 K( h! ~+ C题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
, q- q; A4 C3 [& f4 s, {, D+ j找出1000以内的所有完数。
6 U o5 a8 z7 }8 `1. 程序分析:请参照程序<--上页程序14. 5 W2 k( U _' ]3 n7 e% O
2.程序源代码:
* ~) |9 U+ {; A0 V4 V3 imain()
& S) K; ?/ A6 e& F. s" I{ 0 C% f% ]4 w8 v
static int k[10]; 7 ^$ |0 ]( W3 P* O, N
int i,j,n,s; % a" q& k6 ^$ C. y0 x6 m9 D
for(j=2;j<1000;j++)
+ n k0 Q# D/ M& V6 h" x- ]& S8 o{ ( ~7 f9 ~: E5 s' H. P- z* w# m
n=-1; 2 ^. _& z3 r7 t' {
s=j; . M! V0 [/ Y; ]4 R% O
for(i=1;i {
: U" \$ W: q4 E; s* Fif((j%i)==0)
( D/ X# ]1 S+ ]/ _$ L{ n++;
& r8 I% b/ L) E) V [$ ys=s-i;
" D" t o5 a. f8 F, J; O, H- sk[n]=i;
& U4 t) [! A& d% `* X8 U. R}
R* I5 T, @0 J1 {% `' Q" i7 z# O2 N}
6 o5 A. V L) q' Y) ]' iif(s==0)
$ B h$ l9 }: ~; N, d{ 6 T6 ] q: n# w7 P6 I3 z* J% L- Y
printf("%d is a wanshu",j); T- l( y: j) i) y; w, x* l
for(i=0;i printf("%d,",k);
5 d% e5 `& K9 t1 e5 ?printf("%d\n",k[n]); * V) D3 A5 s8 E1 C
}
O, ]& R) T( t4 v: J# e( E* H- u1 F}
* H5 }- ^" }1 c V% I% ?}
+ H- P; g5 V+ g3 M# g============================================================== ) }, O5 x( T' c( S' |% h2 T
【程序20】
% ]; O( J, ?! v2 v! H: @6 b题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 / o/ i6 K- @$ D% I' ]
第10次落地时,共经过多少米?第10次反弹多高? & p6 G) {8 ]- S6 b& A
1.程序分析:见下面注释 4 x( A; R; Z3 s% r# y0 J. t; c
2.程序源代码:
/ i+ [, v0 q- E8 ^, w; Rmain()
1 u: H0 c& B) ]{
0 O$ q% c& ~3 u# ofloat sn=100.0,hn=sn/2; % q" `* w! x I5 k& Z b
int n;
3 E4 W! f; b. A1 s' Y3 efor(n=2;n<=10;n++)
* \7 W! X0 w) `4 k{ 8 U5 ~$ M9 n5 S3 f: S5 q* o. } C
sn=sn+2*hn;/*第n次落地时共经过的米数*/ $ l; Y0 a7 e! X2 }" l
hn=hn/2; /*第n次反跳高度*/ ) ^6 r0 `/ W. e/ L* P7 J" P
} " u8 Q/ s) ^$ W: p8 {' K" R# X
printf("the total of road is %f\n",sn);
8 x! r4 P7 {3 w- U# W& h& b* kprintf("the tenth is %f meter\n",hn);
' J! N! e" ` r1 U7 u- }} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个# w6 ^% _! \) U9 M( _. j- [$ C
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下3 @# h3 ?$ G$ k5 ~5 B! v5 e% A- b& D
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。" _" P! o- n. W. r
1.程序分析:采取逆向思维的方法,从后往前推断。
& U( S* p2 ?) u. T3 c$ T2.程序源代码:
( n4 H+ R; t) J+ Z: Q8 @main() _7 k5 a! ^$ @
{
- [- s* ?3 h# e! X; a J/ {int day,x1,x2;0 [( G5 r$ [3 p1 \
day=9;
K* B4 o- s% {+ u7 D) C+ ox2=1;
' M& k6 V& ~" W' v wwhile(day>0)
! C% z5 u: c3 d& l9 E6 S8 E: {! T {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/6 H$ A3 Z2 t- h1 {& p
x2=x1;; v5 Y- T9 K7 L0 _$ J2 S* ]
day--;
! l& A# n1 I/ O4 S- Y) Z }
7 m7 H& U J0 v: q9 l6 Uprintf("the total is %d\n",x1);3 a( x; x+ s7 Y- \9 L; s
}
2 l. Z% E1 K6 @4 x4 H" T; ^==============================================================
5 o2 i/ @! z" K" Y* q$ ]【程序22】% w. ^! d5 S! Q! j" j
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
& ^+ P- t$ @: \- u, n 比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出/ P ^- S+ P8 G( Q
三队赛手的名单。 ' c0 a8 r7 L, w, |- B: o# }" y
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,( ^" [4 ~! I4 y8 }' k
则表明此数不是素数,反之是素数。
$ p) w* w& y3 |, C. K; Z+ D2.程序源代码:
4 f. m% \ B( W x8 s |/ Dmain()
( j, Q8 e. H5 ?6 Q; }{- K1 e1 P; T$ j- a8 k# @& b; d0 C
char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/. ]1 J* z, o( F+ W) Y
for(i='x';i<='z';i++), v b4 @0 Q& M' Y# z6 p
for(j='x';j<='z';j++)9 T+ P7 R( n5 J& l z8 w
{
m7 R1 o7 U! ~2 ] if(i!=j)
4 j( ^0 Y" o, @! D9 d for(k='x';k<='z';k++)
: H- [+ I. u+ r8 N1 y, J { if(i!=k&&j!=k): ]* K' b' w! L, l p& J; @6 v
{ if(i!='x'&&k!='x'&&k!='z')" G( A$ u' x2 u+ }3 w6 s5 l
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);4 S% B2 s" B6 R8 q
}
; J7 p" L! K2 x/ \ }
6 m6 v) j/ @* z" P) o( F/ m }6 u) t1 F: i: }' }& t' l: U
}
2 k+ D2 M3 p# D% O4 @==============================================================
5 w+ b- ?% l. ~6 ]【程序23】 $ {6 u8 z3 f6 J# s
题目:打印出如下图案(菱形) *7 g4 `: |5 F/ r# u0 A, e* B Q
***
* K, r$ H2 L u******% P, U% h7 ^& u/ ^' [# J+ T
********) b7 H, J( i ~- ?3 I' S; X! ~2 i" F8 {
******
; W; @& o: y1 f+ N4 Z1 J8 T***
; {( ^# o/ p: Q0 N$ s*
" m9 f: k- Z* w, ^% H1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重1 j8 F1 P& w% s5 C" l7 y, W4 K8 l
for循环,第一层控制行,第二层控制列。
7 E- [8 E% E4 a/ ~7 ^2.程序源代码:
+ d+ Z+ i6 d3 S# k0 ^* Q5 gmain()3 Z" D' o3 [* |# ?
{( b% i! f {7 p1 Z, C9 n4 T9 ?
int i,j,k;
5 i! |" y! m0 G. I6 f% qfor(i=0;i<=3;i++)
$ ?! N" w7 b y, }+ V) D9 H {
* |7 l+ b/ D3 X8 h5 m3 |- G9 ~ for(j=0;j<=2-i;j++)
& p; |4 \ a1 F: u( C9 ] printf(" ");7 D2 m# Q3 W& [
for(k=0;k<=2*i;k++)/ k/ {- b* c2 \0 ?+ W& t
printf("*");" e: q$ @2 ?, I
printf("\n");& ^2 b. q- k6 J8 t( d
}
7 Y( j1 }! ]) k3 |; @& [. m( @for(i=0;i<=2;i++)
* j1 ]' w" L% s" ]8 Y4 |- G {
8 a9 u7 h4 B0 y. T* K for(j=0;j<=i;j++)0 ~2 X) P5 c' I
printf(" "); D2 ], o) k: B* `- n9 j0 Q
for(k=0;k<=4-2*i;k++)
; V2 R# K6 p& i n } printf("*");
4 | J3 b+ T3 f2 w& `" } printf("\n");
, R& d4 o, H7 [ f- [ V }
, z0 [! l. T$ Z/ [5 j8 g}3 s/ h# `; B @2 X) U7 w. z1 ^
==============================================================
& I6 V3 s1 X( H- ^! b' D8 ]7 k. u2 D【程序24】
( A7 m) L* c( |, Z$ U) ?- ~题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。1 q& Y8 n* k, q. }) x
1.程序分析:请抓住分子与分母的变化规律。 1 b: E2 V d7 L {4 @& e
2.程序源代码:+ M' n. h4 x& i9 Q3 {
main()) S& Q7 q% Z1 j3 Q* l2 f3 u* @' S5 v: k( I
{
' U2 W" a3 i& a4 w- ~int n,t,number=20;3 D7 t* H7 }- H5 t
float a=2,b=1,s=0;
d" ~. d8 v- K' \# ^! Yfor(n=1;n<=number;n++)
N8 P: S& r( Q {; \: o7 j' F6 c
s=s+a/b;. e, Y* x5 S9 v; O: W5 N
t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/9 n. ]! \' W2 v2 y; P y
}
# s# L) I* ~9 Fprintf("sum is %9.6f\n",s);
; m; n5 G7 P: z0 c5 I} H% E1 D3 P' s# E2 N
==============================================================
- j+ Q1 K- Y: J" r- d【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要, s+ R5 L, b! K; B0 m
题目:求1+2!+3!+...+20!的和, v. w6 V, Q8 C; ^) }5 {
1.程序分析:此程序只是把累加变成了累乘。 & t3 q& R0 I( d' p3 [* X
2.程序源代码:: ~- G& _* W' W; p9 Z! a
main()
x$ {/ i. r% W; r{ h1 O" S( ]$ N, S3 J
float n,s=0,t=1;$ N. |! _0 j' A4 v) q5 r7 B
for(n=1;n<=20;n++)
0 O: ]1 Y8 u% H# I {
$ t6 ~4 w. v. F1 W v t*=n;
v8 Y. O- Y! l* f s+=t;/ f2 X. n/ S( Q, K% J5 R8 w
}
9 {2 v2 O0 |4 yprintf("1+2!+3!...+20!=%e\n",s);
" u) b H3 f, M V6 z; c# l9 b}
: n' Z" m& \0 E8 D2 i, o8 K. \% F==============================================================
$ A0 y9 U, T6 E0 i# O【程序26】 % [3 q% D+ V$ s9 u( q$ K$ g
题目:利用递归方法求5!。
1 v" T# }# D( V* P# X1.程序分析:递归公式:fn=fn_1*4!
7 s1 \" [) F5 K. u( Q2.程序源代码:- `2 B2 N, x9 b6 {, O- r
#include "stdio.h"( B5 L8 D. N1 M
main()) B9 C, a3 ^5 a* L
{" ~; x1 F, S5 C" J+ E
int i;
7 I2 N6 s5 B4 d7 iint fact();3 O- v- ?: ]5 p, x! R: m* B( x6 s
for(i=0;i<5;i++)4 g* a: ^) {- e8 h! e3 W( L+ f+ k
printf("\40:%d!=%d\n",i,fact(i));/ Y3 ]/ {, z7 _& H
}
/ w6 w6 ?8 ~2 hint fact(j): z/ g, M8 I% p9 N
int j;
\- s$ V# Y# l1 Z8 t( o{
. |# _' X; F' C7 G( S" _int sum;. a/ V" \1 D. X6 ^) r }) w
if(j==0)2 t' y a" I5 M( o6 d
sum=1;
& q5 g. `9 d$ W$ |else
5 n; j7 [8 R+ U7 [ sum=j*fact(j-1);9 X6 J; ?2 |+ S. V8 C; m
return sum;
, R8 [" t: C# f7 J$ t9 I& j}
2 L! q8 |7 b- ?: H+ S. `! T==============================================================
0 H" ^( h& i7 ]( j( T |