【程序16】 4 v% x/ |# a1 f7 G. p
題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 0 I& C7 V& d+ z9 J ^( \; F
7 i; M- D" L" q2 a. B- l8 i& n( i
8 k. w1 S3 i+ V- X4 a- [
% {4 f* I$ a: ~+ w9 o+ Y作者: zhlei81 2005-1-22 11:30 回復此發言 6 O5 C2 A9 d8 L' N9 z" P! u
, B1 `; J8 ^; y0 n
--------------------------------------------------------------------------------
8 H8 |8 |0 r P0 w: x. g3 e% k. U7 d
% O- X$ U; h! k P4 回復:經典C源程序100例
& F9 R- b) Q6 S4 I$ K1.程序分析:利用輾除法。 2 _1 L1 K& w- v5 E- u
$ F' L2 ^: ?( B N( b+ ~0 K2.程序源代碼: 3 r8 V/ H' E5 y- f2 u
main() - _! Q" p+ ?& C( X
{
* C" C. s4 k8 K( J# D' U4 zint a,b,num1,num2,temp;
6 t" K \% m7 m. O, i9 U! `2 xprintf("please input two numbers:\n"); # Y# a, b4 t8 P( [
scanf("%d,%d",&num1,&num2);
! {" l2 u- h5 Kif(num1 { temp=num1;
% Q! i/ T- E' Z( Ynum1=num2; ' _+ K# ^0 a9 j* m5 U
num2=temp;
' r/ ^) _# x3 Y& L" v$ ?7 w6 b+ {/ E# b}
8 L" J0 ~9 I- m7 G, Ha=num1;b=num2;
& e9 h, Y, C2 L: Qwhile(b!=0)/*利用輾除法,直到b為0為止*/ $ ]; z: i! H% z0 ]7 }2 m0 ]& ^
{ Z' |# }( C- x1 `9 R* k8 h
temp=a%b;
, w( l4 S4 v u* k& L0 `* ~a=b;
5 b9 Y! W/ J8 L. S6 p, q8 }b=temp; / Q; ?4 r& C# A* k5 E/ \! p0 \: D
} 0 R& o; \& h5 Q
printf("gongyueshu:%d\n",a); ! i) u, `% T2 [9 {2 {% T5 R
printf("gongbeishu:%d\n",num1*num2/a); / v& l3 a4 R) Z
}
* O, W, w+ |4 E! ^3 f* Z============================================================== 2 i% L1 w8 d) |9 F$ m+ W2 c: b, p" E
【程序17】 3 d* F0 ~- a5 M
題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。
- y$ v( C7 K5 D( Q1.程序分析:利用while語句,條件為輸入的字符不為'\n'.
5 g9 @0 c6 B: b$ F% s9 _* i. z( n. P% E1 M1 e7 s
2.程序源代碼:
4 F$ {1 B7 [& S5 K( N" |1 v. t3 @#include "stdio.h" 7 U# ? u- y% G0 X% k
main()
- p7 L0 z% J- o$ _) c# P{char c;
$ G2 j5 z3 D6 i* h9 s! bint letters=0,space=0,digit=0,others=0;
) C ~8 T$ b: t* r& f! eprintf("please input some characters\n");
: o5 G( e9 D" V$ `" z9 h3 i, rwhile((c=getchar())!='\n')
& \& O7 _5 [+ n; Q{ 1 E" _/ c+ q1 G6 h7 K% [
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
1 _" o* g$ w. j6 D" `$ N* `) Iletters++; j8 k8 i8 P6 u' k* l5 F- \7 Y$ k7 i7 m
else if(c==' ') , _- M6 C9 V; N. J. |
space++; 3 G2 k# j' z2 x9 d" f
else if(c>='0'&&c<='9')
* h2 P) k/ W; rdigit++;
& g! j3 d$ O- Q0 U: h) `1 delse ( E- m! N! R) a3 @3 l: a- x8 n
others++; : ~! I# W, d" q
} 1 v* p) \' d0 R4 P) f6 M! i% B
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 6 E& \3 k0 H5 t9 H
space,digit,others); + V' q `7 R/ U! ^1 d7 C: J
} 5 `, {. y+ b2 ]* M
============================================================== 1 M& W) t7 O3 X) _# |% o
【程序18】
5 K7 R0 }5 \' f* }! T題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時 6 ~# {6 O$ p' z3 u. H. H P
共有5個數相加),幾個數相加有鍵盤控制。 7 ~/ c0 B4 q) @
1.程序分析:關鍵是計算出每一項的值。 1 r! O/ U1 |! b* ~+ r/ d
2.程序源代碼:
q* h$ c- ^/ \1 K4 Amain() ; C; @, ^' X; r7 L
{ 1 b3 j& h& _% L" U _7 `
int a,n,count=1;
/ Z; v7 i; n g, @; l9 Jlong int sn=0,tn=0;
+ F3 N4 v9 B8 ?. f ]+ y8 A6 q( G: Dprintf("please input a and n\n"); ! N1 f% W. i5 t% y8 H& `4 @
scanf("%d,%d",&a,&n); 5 N& A$ q2 q& b9 K* B2 _
printf("a=%d,n=%d\n",a,n); $ ~* w# } L$ \! Q c
while(count<=n)
' f% B3 A9 K9 ~% {1 H7 u{ $ z) e+ P$ Q9 n9 X, {
tn=tn+a;
, u+ B, @ [+ b1 \& Csn=sn+tn; ) A& v' W$ P9 X+ G; A# l1 R
a=a*10;
, F p& L# \) A* `8 c0 Z* p++count; 7 a0 p- P7 b6 C2 g# @, w" d
}
4 `& W4 V9 w* y1 F/ F+ vprintf("a+aa+...=%ld\n",sn);
0 }( n( Q4 B! w- T% |' q4 n5 e} 9 \+ |2 B# h8 @# v. q; R, }- a+ k" D
============================================================== ' r/ J5 |$ `, m& p7 t# k
【程序19】 / N0 L! x* a6 }! s9 p, K
題目:一個數如果恰好等于它的因子之和,這個數就稱為“完數”。例如6=1+2+3.編程
0 m/ V3 W9 h6 I+ ^找出1000以內的所有完數。
5 A: K% \8 U: w9 b1. 程序分析:請參照程序<--上頁程序14.
7 L, s0 Y: U l$ v5 D7 i2.程序源代碼:
: Q" Y$ ?& h8 t: V* B& [9 `main() , s; k. `. |% E4 |) @
{
9 \' S0 L5 g) Astatic int k[10]; 5 G, e" ~ C. C1 E& N; ^
int i,j,n,s;
" c" ^2 r% | f% Gfor(j=2;j<1000;j++)
6 d# G# z; N$ ^+ q: w, @{
, d# ?6 v# l- U7 o' Y0 F+ U1 a2 [n=-1;
) @2 d0 J6 q& b- f. P x2 e) L( Ss=j; - x# U& N& H! A5 n
for(i=1;i {
* P. G6 J% z% n: g0 B7 Fif((j%i)==0)
c, n- ^4 e7 j6 B8 x{ n++;
. [( O8 Q$ W; Q! O4 rs=s-i; 9 f$ C: \; ~! a! U
k[n]=i;
0 R5 I- O. d9 ?}
0 V7 w) x6 K5 G( F, u} ; `" `3 e& g o$ `5 U5 K
if(s==0) 3 U! E+ B1 E4 j! j9 k5 s, X
{
, x3 M- q( G0 j; o; K6 wprintf("%d is a wanshu",j);
- z5 z. y- b! B6 p' E& efor(i=0;i printf("%d,",k);
9 R) O7 J0 K( U/ ~printf("%d\n",k[n]);
b. o$ B. m8 V6 n9 y% ^7 j% K6 X} 5 g4 F, b/ A2 b1 T
} % k" h! e8 E! d5 N- A
}
& g% Z1 j: s3 k, i5 H" K==============================================================
, U& Q4 ^% s* I4 M2 y【程序20】 1 u) m# Q* j5 X3 n5 R
題目:一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
& W7 I, s/ z5 g5 F& N第10次落地時,共經過多少米?第10次反彈多高?
& w7 g) T5 l& {1.程序分析:見下面注釋
; v& h) r/ o# m. g; y' {- ~2 R- r2.程序源代碼:
( L& M+ \& s# W) F, gmain() 3 u6 A3 t/ J+ { w
{
4 q4 M) H( E& C8 U- Lfloat sn=100.0,hn=sn/2; 4 Y: ^8 e+ Z: y1 i1 g2 ]
int n;
- d. g$ F% i3 a0 i1 g( ~for(n=2;n<=10;n++)
5 E) R( M. |+ O6 q) K Z1 _{
! ]% X9 \, T. i: Ksn=sn+2*hn;/*第n次落地時共經過的米數*/
$ \) {: S x$ |+ J a- Ahn=hn/2; /*第n次反跳高度*/
1 r1 A; v4 Z- i" M} 7 {, t1 I1 [5 s9 d% C3 C" y) Z) k
printf("the total of road is %f\n",sn);
, j+ t' t" c8 U! D; h; V/ p0 r# @printf("the tenth is %f meter\n",hn);
# h1 _$ B; f; w- I0 {5 r} 【程序21】 題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個
* g' L3 S2 J* h! f" {/ l A' `- A+ i 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下. T1 @4 M9 o- |8 m& h, N
的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。/ ]; `3 v F9 F) X
1.程序分析:采取逆向思維的方法,從后往前推斷。& W! Y" E" }( g j
2.程序源代碼:# [' O: k4 A- i1 B
main()+ Z7 G) [& f$ \# w% b
{3 F; w8 S, B. O5 `+ B# T) N/ k( E+ x
int day,x1,x2;/ h5 ?2 b# h6 s; r8 k$ ~
day=9;6 K7 ^+ ]5 J" b6 L7 F, [
x2=1;
) S- y( s# H/ |; e- Wwhile(day>0)
/ x' ?4 Z+ d% e7 z3 _! ]( ~ {x1=(x2+1)*2;/*第一天的桃子數是第2天桃子數加1后的2倍*/
8 m) E$ `* Y& K8 X0 u x2=x1;
- V1 Q. u1 o4 q- ]0 [ day--;4 D, D7 F' @! x6 C3 i
}
. y K/ Z" T1 Y- _0 a6 wprintf("the total is %d\n",x1);
. W; o* s( P, d}
}- Y! b9 e$ I4 a2 y==============================================================
% L* Y* p+ U. {- }; ?( m【程序22】6 m/ G1 i/ N% a" Q
題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定& g' s% Z. U2 [! [6 u# A. K
比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出: d: S& c# H. N3 {) o- P
三隊賽手的名單。 ) Y. s6 O+ K( J' k5 X
1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,% _$ r3 ^, J4 a' H1 _
則表明此數不是素數,反之是素數。
e- Y# R1 }1 p$ q3 C" b0 ]6 C. d! ~6 U2.程序源代碼:
6 E* A. r6 P% e. V* Lmain()/ R4 b/ e: e; q
{* W8 m/ E5 x% v; C; q" M) m
char i,j,k;/*i是a的對手,j是b的對手,k是c的對手*/9 n( @( ^5 |; q& H4 {
for(i='x';i<='z';i++)
5 N' w0 L6 s; @2 R for(j='x';j<='z';j++)% g/ J, f% M# b; e8 b
{5 b8 X& P8 ^$ |! H v
if(i!=j)
& |/ c d V- c7 o# A! U for(k='x';k<='z';k++)) N) P3 D; E1 ] u- h! q+ ~
{ if(i!=k&&j!=k)
6 J \' j* w) G% {% o2 S1 x { if(i!='x'&&k!='x'&&k!='z')
( y! f. t. J& _. p9 J/ l8 H- t printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);' G2 B$ p% ^0 b/ Z0 T, }6 [9 G" O
}
) e! J! |4 N. S; F- ]7 @: j, w }! |! V: w2 \& o
} c& d* U: ]4 A0 s: q' V- M
}5 B0 n& n/ C' ?& G G* E$ I9 t
==============================================================
/ ~% t. r! ]& V4 ]【程序23】 " l8 P2 \1 X+ S) x
題目:打印出如下圖案(菱形) *
7 O/ y+ v5 U1 B$ X***# P; K) Q6 Z) g4 d5 f( _' k
******& H$ _0 |# x; F' k
********: M6 Q5 F% t7 `: S) n* P
******' d5 g$ c s% c" _" H8 Y5 l
***
8 i7 S1 |. y0 m2 ?* S/ V/ _) ^*9 K9 d8 ?! L2 I8 x4 R$ \7 }2 k/ n; {* \
1.程序分析:先把圖形分成兩部分來看待,前四行一個規律,后三行一個規律,利用雙重9 b5 c, i; p1 C
for循環,第一層控制行,第二層控制列。
+ `' n+ q1 s5 y$ D2 J; J$ @2.程序源代碼:
0 G' v- q* X+ n7 s; |main()
* Z I3 u, m$ ?* u{- h1 t6 N- H) e& `; o1 u% O; r0 b
int i,j,k;: I, I; v7 Q9 s1 B {
for(i=0;i<=3;i++)
0 e, a2 W# E" H- \8 q {0 t" {: \5 g" u% O8 L
for(j=0;j<=2-i;j++)
9 B! K8 S' m% \$ l- A) Y0 W% B printf(" ");) }( e1 y1 F a5 q( P
for(k=0;k<=2*i;k++)1 [: Q' s/ Z2 b) {' H* i* q8 C7 Q: Y
printf("*");
! M- [' O3 W- j7 h: [5 W printf("\n");
5 F& z, B5 H& c% ]8 C; C9 s, e }
; N! o" y. N* ]& n9 J2 Lfor(i=0;i<=2;i++)
( n3 i* e, v; e( f# `+ P& N {! [; G9 M9 e" d5 D' t/ \
for(j=0;j<=i;j++)
0 z1 a: k9 K; M. F! d8 }/ t printf(" ");8 b* Y8 O6 x0 x+ h; m3 R' j) t
for(k=0;k<=4-2*i;k++)
0 a/ [, i7 W8 J2 y5 ?2 l* Y printf("*");) ]" @3 |# o$ v
printf("\n");4 i; s7 \% r" P: p
}8 a5 o6 c+ K" K- s7 X) k
}
) x U; u# e1 a Q# \# V==============================================================
* E% d6 \) Q. K, I1 N0 n9 ~7 W【程序24】
1 D# G- t7 _" i# y% b$ N# l5 \題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。& t; ?+ P0 a- y8 r1 {/ H
1.程序分析:請抓住分子與分母的變化規律。
2 a" H4 C6 ]: K6 ~2.程序源代碼:
! ~+ P8 d/ Z2 C$ C4 @( [main()
7 J5 x: i* l' P1 @{
$ b$ R6 f, b: ?, Oint n,t,number=20;& o% c' _$ v+ K
float a=2,b=1,s=0;6 {- q! j# w0 M0 _7 Z, ]+ W
for(n=1;n<=number;n++), [1 o' u* g+ H+ O$ q' |4 L0 a
{
5 X3 s& m2 }. B3 \ s=s+a/b;
4 }- J! g2 P, s9 z4 N; H m# H t=a;a=a+b;b=t;/*這部分是程序的關鍵,請讀者猜猜t的作用*/" T5 r* W( i4 U! ^5 l
}
3 u. [9 ?* X" z& C; jprintf("sum is %9.6f\n",s);
& ^2 T- d+ O9 P. f}% ~# `7 i6 r, F) H% f ~
==============================================================
+ d# \. E' o* I: Y" _【程序25】 嵌入式學習企鵝要妖氣嗚嗚吧久零就要( N; E( G$ G/ T8 m: r
題目:求1+2!+3!+...+20!的和
8 |& z3 K# j3 k1.程序分析:此程序只是把累加變成了累乘。
" _) s$ C: N' N4 z! h2.程序源代碼:
. n* w5 X4 u y9 y" H% {) m9 hmain()
7 m9 C3 E4 p, P' @{
' d1 Z, E5 i) C- t. ?7 ffloat n,s=0,t=1;0 `5 ^8 u3 G- f5 x; g
for(n=1;n<=20;n++)$ F5 ~3 e" w/ F1 P" W7 O" x
{
! Y- v1 O: Z: k. r+ P( P2 B t*=n;
% V" N+ B8 J4 F. A$ P6 b2 M s+=t;5 o$ l) \/ _ x/ N; _8 N. M
}
# H4 d! B3 @/ c/ o0 Q/ L2 m# |printf("1+2!+3!...+20!=%e\n",s);( x2 ?5 V! y6 E
}
; w% Z: K: ^# a6 I. O8 v$ D- m==============================================================4 ~3 d2 Q/ e2 Y1 [
【程序26】 7 m/ R0 R9 r" C9 X M2 g% A! t! S- j
題目:利用遞歸方法求5!。
6 k# Y! G) U8 [0 ^5 Y" V; T# ~8 t1.程序分析:遞歸公式:fn=fn_1*4!! ?! V) ]& a0 n; ^& {
2.程序源代碼:) a2 o" f6 u3 W" |( ^- ]/ _
#include "stdio.h"' {: O9 b" [3 s& g" g8 K
main(), H; J* p0 ?$ x8 q. w& i
{
' V: j: d" a2 N: nint i;2 ?. V; U& D' C
int fact();; g( L: b8 n7 J7 j/ K7 \* s
for(i=0;i<5;i++)8 j0 L0 d. C/ B$ f
printf("\40:%d!=%d\n",i,fact(i));" V9 f0 M7 }# ?) C n. C5 [
}$ {( d1 j3 u" `% d) U$ Q6 m
int fact(j)
* R" O, j2 ?: v9 l. H/ }5 a/ ~int j;
0 P5 N+ e4 }, `2 x% o" j$ D1 \# i{
+ c8 {' g. }/ c8 w* m2 Zint sum;2 V; O' s+ u3 M l0 c( i8 D
if(j==0)0 Z$ @* h7 A# w- M0 Q, ~( n* H
sum=1;+ h+ J: b7 F0 I' K" k
else! B( y1 i% L$ I1 w2 c0 m( L
sum=j*fact(j-1);
+ U7 w! X/ T, m7 |1 d- ?return sum; d) m; U+ u2 p$ C0 x8 \
}
]7 G2 P6 ^* D2 D* R$ x! p) l==============================================================
6 O6 g3 i: R* h/ E |