EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
【程序16】 4 g5 o! i- o" N1 v; X
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 : `3 m: M0 J+ C+ `
* h( t: @) _" H! b- `, O2 u) I: A2 Z. V
$ ?; v9 t# f4 W/ u) o9 k2 c
作者: zhlei81 2005-1-22 11:30 回复此发言 / R$ l+ R$ e3 O6 f% r% B$ Y
( g2 U$ K' x: ~9 ^5 {' U. \-------------------------------------------------------------------------------- # C# O5 G- q& P. Q4 g/ o
! I4 j! F. _4 g- F
4 回复:经典C源程序100例
9 \4 r( y9 p. n6 R( ^" d" l1.程序分析:利用辗除法。
% e' \7 S) K9 ^3 v$ l. y8 `1 `) z; \' D4 R
2.程序源代码: , S& ?6 l$ F/ W4 V
main()
( K* O6 K& F6 w( Y7 w, ]# y4 i! m; q) H{
5 u9 v0 V5 @' h3 p# y0 F+ ~int a,b,num1,num2,temp; # D* }( I) P" D9 w0 m: N
printf("please input two numbers:\n");
% e/ a( u- P" B* U4 a: n. }7 [$ Vscanf("%d,%d",&num1,&num2);
v0 e1 B& N! I) i3 T6 f$ aif(num1 { temp=num1; + w+ _2 Z \4 Q/ q# R0 D6 S
num1=num2;
* b$ t9 {- e* T+ Jnum2=temp; : X/ l; Y8 v! u- q
}
& c. S9 ~( A* k" ~a=num1;b=num2;
9 Q1 h7 ]5 \: g+ T& M! i" C9 Twhile(b!=0)/*利用辗除法,直到b为0为止*/
. f7 a: h# f: }7 H{
: Y }5 ?( L9 e$ Ktemp=a%b;
- O: }# v& ]5 i2 wa=b;
! w7 L2 T& H2 \3 ]! ]/ [b=temp;
7 P Q% c! x4 a5 Z}
; `% s X# G$ a$ C, V9 Vprintf("gongyueshu:%d\n",a);
* Y$ g3 R& Z! Hprintf("gongbeishu:%d\n",num1*num2/a);
* O& s* W. Q. c- G} 1 Y4 g7 j9 A3 |+ {9 |% t6 w; j0 i) y
==============================================================
! M. ?' ?, J! F; w R【程序17】
" }) u& g" p# R/ O p t! X题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 4 l- ]8 X! l3 n/ X: E, F0 _
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
9 B7 V8 V7 w5 a
: v! U8 j0 Q7 s& ^- ~0 [2.程序源代码: 3 w, v; O( j c
#include "stdio.h"
+ [3 I- H+ @+ k; Hmain() 1 H5 D, h5 R" D5 W) \ ^2 t4 w
{char c;
( H0 m9 }6 N/ S" l2 h/ Zint letters=0,space=0,digit=0,others=0;
8 u: P& X. T i9 E8 \printf("please input some characters\n");
; k' P3 u1 ?/ {1 |while((c=getchar())!='\n')
! h& s& g0 l, B. u$ e{ $ ^% t4 @" M/ C& x; E) P& D
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
+ M4 x8 A- |, Z! q5 l1 [letters++; # p$ _5 Z, ]0 J' o8 S' ?
else if(c==' ')
8 ?" _- r* Y# p* Y3 v: U, ^# Cspace++; : x9 `2 F# w, p2 @
else if(c>='0'&&c<='9')
7 V5 E0 x! |+ i* T) `5 E+ Idigit++; , b4 Q3 F5 S0 e+ e
else - K2 ^! S3 ?3 f& M- N
others++;
- V2 O5 p2 {( F+ h}
2 K. k( R) [- Kprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
; c9 `/ L( s6 @5 Qspace,digit,others);
; z6 |2 j( d$ i7 `}
+ a E$ Q. w9 f/ A; G" I j5 L2 m& J0 G# k==============================================================
h( k: _$ Q/ `& W4 X% J【程序18】 6 L7 s9 E- W# E7 t( g
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 * [- E @" N( |2 a6 A
共有5个数相加),几个数相加有键盘控制。
& S* r7 ~8 P! V( x- B; Y* e1.程序分析:关键是计算出每一项的值。
& g6 j1 |6 f" b( e3 _# F' P2.程序源代码: ! [' c# Q+ @0 y" g3 n6 G" z
main()
$ c. B2 `' A" \0 h2 d# `{ 9 F0 R: x6 u% l- @4 e4 y6 T+ I
int a,n,count=1;
" f/ m5 O% q5 r* [2 x1 M4 {/ {4 D8 ulong int sn=0,tn=0;
0 @+ i* I" v$ U, ?. \printf("please input a and n\n");
5 E ?6 A5 ]2 }/ L6 |9 sscanf("%d,%d",&a,&n); - G0 X ?4 O4 k& X! U$ p9 Y
printf("a=%d,n=%d\n",a,n); $ O+ j* z- e) [. S
while(count<=n)
% s( P. p( o, W" F+ b. A, c{ . `0 Q8 `0 y n0 P% o( Y9 x
tn=tn+a; 8 P9 X2 e" h) n
sn=sn+tn; 5 ]! Y6 C9 {, ]
a=a*10; + c7 G( |1 f! |! K }$ b
++count;
+ s5 T' i. J4 u}
8 W$ H% T; B4 eprintf("a+aa+...=%ld\n",sn); 9 }! V+ J" J% s& c5 |* J& a
} 5 v2 e/ M; q' L' y) P
============================================================== 2 J6 \! c, o, e2 g. r% ?% n
【程序19】 ; p$ r% w' w" s* j" N( H' }
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
; e- a( o/ r8 u4 e1 }/ f$ {找出1000以内的所有完数。
, k/ G* J1 r0 G5 H# l1. 程序分析:请参照程序<--上页程序14.
2 F4 P7 \/ |7 S' g2.程序源代码: * d0 b2 V0 O! C( P9 O1 t& t0 H
main() & U: b4 }1 F. J& D$ `: @
{ 0 s- n3 |2 b9 ?& N7 x' e# u
static int k[10]; 3 V! z8 a2 K5 `4 Y, y" g ], a0 u
int i,j,n,s;
% W/ `; g/ q( w8 ?for(j=2;j<1000;j++)
9 N. u' B# T' Y! k) C{ 8 ]' R. O1 O' d2 ^
n=-1; - V) j' M% U- k7 |! L
s=j;
! g1 U3 u# ^8 j0 Dfor(i=1;i {
2 l4 g7 Q7 n8 N6 `( g& Iif((j%i)==0) ( }4 j2 l I. T* A% M
{ n++; & q' L- v& B9 B G# X# u
s=s-i;
# s) C5 G* u9 \0 G8 S7 x' nk[n]=i;
0 o! _5 I( b" l8 g4 a- S5 V# ]}
' ^9 `7 M' a, @" d2 {4 E2 \} * d' ^% B3 \- G& x
if(s==0)
@8 P2 g* a; n( Q5 ]$ a" f, F{
8 |2 g' D5 p; D+ @printf("%d is a wanshu",j); 8 ?; h+ e: ?( w
for(i=0;i printf("%d,",k); ' K1 o b) U. n" j% _! V( K
printf("%d\n",k[n]); 4 U s0 T* z: c2 }
} 5 s) G& s9 _+ `; t: a1 }
}
( J5 h2 Y$ Q! \2 {2 I}
- l+ g3 {, @& ^/ E: t! j& P3 ~0 k==============================================================
- F) w7 n7 x G; ~- y$ o【程序20】 5 M8 ? x8 d& h9 h/ D% Z- [
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
- E' l/ z! R' T& ?第10次落地时,共经过多少米?第10次反弹多高? ; M3 ^. T0 x3 F
1.程序分析:见下面注释 ) N. U1 z w9 K) }! o
2.程序源代码: 6 [- h4 m9 Z4 Y6 N, u& c
main() 5 X+ U# S: a; _6 Y4 Q. v' x
{ 1 F" p, A; j4 `( q) M
float sn=100.0,hn=sn/2; " b& x. z, b) ^, i
int n; ; r& E& t) t$ T- C, k, W6 i
for(n=2;n<=10;n++)
- c, z) P: z, a9 {8 N4 `! _" m{
. d6 \" q/ o, t# i# S/ J4 n7 nsn=sn+2*hn;/*第n次落地时共经过的米数*/
c. B- }0 n" ?& k; M9 lhn=hn/2; /*第n次反跳高度*/
! F8 @2 ]1 [% w8 x' X# F- r k}
" S- }/ {* Q. P$ z+ Kprintf("the total of road is %f\n",sn); & ~& L7 P" }9 K# e9 ^/ q9 L
printf("the tenth is %f meter\n",hn);
2 ?' P; D! [ ^6 e4 g0 m} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
6 [2 d, N6 c; \) g% G 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下0 L5 _/ @- R. b& g5 ]3 v
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 o0 l" _# z o8 G! G8 h
1.程序分析:采取逆向思维的方法,从后往前推断。+ t& i( q9 v+ {; e# r6 O/ M
2.程序源代码:% M- L" u W7 Y3 N J2 j3 z
main()/ `6 t/ r4 J4 T. z1 x# d) Y6 a5 V
{
& s) C8 g9 U' n. `+ B8 f5 O% P. u: Nint day,x1,x2;
+ p7 R1 n. l r3 Uday=9;# I- c D5 U6 e1 Y& g
x2=1;
' Z: G: G6 i8 f' l6 F' s* F& w- Twhile(day>0)$ s6 j, r# ~' Q
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/8 @: }( p4 m% z( h
x2=x1;
; k$ @' [: M) O. g4 }0 P; Z day--;5 v7 e0 ^% i. v: \* y4 q$ q, Z
}( ]2 g) `- ^) K' N/ D. O
printf("the total is %d\n",x1);
4 V' H1 E2 B! R! ]0 A}
4 }6 _- B- L2 ?- g8 d n==============================================================! C4 v; B2 L8 g# ?8 U
【程序22】
% Y+ J6 n* m+ {. p, ?题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定) z4 v. E, f+ J) a9 `
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出 z7 l3 Z- ?) D: v" J0 _
三队赛手的名单。 : c: _; V3 r2 _8 ~
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
! I+ B; w( J7 s8 s/ T 则表明此数不是素数,反之是素数。 ' [! o/ u/ A1 K u- A% e
2.程序源代码:
3 ~, Z7 C# | R" ~0 _1 S8 Emain()9 p |4 t. a7 s% M
{
& c! S! b* x+ \9 o$ [5 I H: Vchar i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/5 A! C- x. F5 L- E- K0 N, q
for(i='x';i<='z';i++)! K) W k7 {5 p0 J9 t3 L" p) U
for(j='x';j<='z';j++)# h" y- X2 M N" d
{
2 D, D. ?( _1 s if(i!=j): t' D3 J" `# M i+ Q! E# T, ?8 Z
for(k='x';k<='z';k++)% H% G# h. n8 u4 F5 b
{ if(i!=k&&j!=k)$ M6 L' @7 H3 z% i2 E
{ if(i!='x'&&k!='x'&&k!='z')
8 u% i0 I) v6 T* I, f. I printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);0 d4 C9 n8 @) r# `6 a' x
}
3 p/ r* A+ g l9 L }2 A q; X" v8 e3 J" m/ N
}
7 S: e' }: `( c6 Z( h; C}
/ B, S! l z) X) i$ Z* c4 K, I==============================================================
( }/ G2 M9 M9 H; q: c; {4 n【程序23】 - m. s# C! M$ D& u
题目:打印出如下图案(菱形) *
8 n& M- b" t; ?6 K2 E0 u2 `6 R" a2 h***
u; y! Y: g8 u6 a****** 3 Z- k8 U8 H$ }
********
6 X$ U, F% a+ q/ U( }******
7 K& I( I/ l5 o/ D) o6 x+ V***
! U# A5 `# y( [$ l* . k6 u0 G5 G- g0 W* H
1. 程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
x2 r+ `( y0 ]' r# Q for 循环,第一层控制行,第二层控制列。 ( q7 L% H! @2 j# ?8 Z! O/ A& S3 _5 ^
2. 程序源代码:
) y& V' Z, _6 t- J/ S: Mmain()
8 ~3 ?/ ~: b1 _& H; M' L [6 [{ 4 c1 C7 s. V3 v: c6 c w- X3 W% Z
int i,j,k; 6 U8 {* `8 T, t4 a
for(i=0;i<=3;i++) 9 Q) r2 N, G5 D' P
{
u4 B3 |) y0 q for(j=0;j<=2-i;j++)
* s7 k7 c% K1 l. ^' ~6 y, v1 P printf(" "); 6 l5 y7 s! x j5 T& E8 F1 q" h" C9 [
for(k=0;k<=2*i;k++)
U2 t# f7 y, ?$ s4 ? printf("*");
( l- U4 I) B- Y7 A* k printf("\n"); $ ^( {3 Y0 Q6 n5 a) U6 |, U
}
" |, w. z! V% O/ Z Zfor(i=0;i<=2;i++) / `$ `; U: F% ]8 J/ Z/ {
{
8 V" B" d" G# y: B# q for(j=0;j<=i;j++)
# F" I; A: @: p! p3 F6 y$ Q& G printf(" ");
) I, Y$ `4 |3 j- O) s" f# K for(k=0;k<=4-2*i;k++) 8 W7 t1 \3 P( z" G
printf("*");
6 `0 |7 ^7 d/ g7 B. A6 Q printf("\n"); ) ^! ?& P0 g! p3 T7 u, c$ A! e
} ; s8 P# I/ C% m* a4 O) v7 T
}
6 h# [6 l6 ]" }8 b% ?9 [" `==============================================================
- U9 I4 w6 {, p+ d! L$ Y ]【程序24 】 9 \$ W" n5 {9 J- V' C
题目:有一分数序列:2/1 ,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。! T! Y$ ~ X4 k. e1 M
1. 程序分析:请抓住分子与分母的变化规律。
# |3 [$ C( D. P P2 E% E" V& y. r' w2. 程序源代码:8 p' P; W9 c* t, H- R/ B
main()
1 R, G w1 p+ |5 {% U3 x{ * l w0 y) P4 P4 C
int n,t,number=20;
/ ]8 N. `$ g* Q: [float a=2,b=1,s=0;
5 {2 Q& p- K: y8 Dfor(n=1;n<=number;n++)
) f4 `! h! ~0 t( ?& |( x3 Z {
9 m, v) ~! D% O$ g& ^! h s=s+a/b;
( w3 ?0 C f! ~% M" e( E$ F' a8 v t=a;a=a+b;b=t;/* 这部分是程序的关键,请读者猜猜t的作用*/6 F1 k: T3 }! C# ?. j( s6 c
} - _$ G; } B( m. o3 h4 v, B7 x
printf("sum is %9.6f\n",s); : W1 ?" P, {0 b' W" o
}
- ~- ?) \; i8 E==============================================================
& ^8 f( g8 t- G" V/ h3 K【程序25 】 嵌入式学习企鹅要妖气呜呜吧久零就要
0 R0 y, s. M. e" o( P题目:求1+2!+3!+...+20! 的和
; u$ W6 [( k4 w) |) x4 t$ W% z1. 程序分析:此程序只是把累加变成了累乘。 ' G8 i, A9 s* j* g3 s& m' f
2. 程序源代码:0 x9 D$ D4 j: n% K4 U7 @, _6 O* p
main() % M+ W$ [7 w9 H, Q: Q4 K
{ * M7 S$ S+ {1 |6 o+ M9 z
float n,s=0,t=1; 0 u; E9 ]3 @5 r
for(n=1;n<=20;n++)
w( R) J$ h/ w. Z( }- t {
# R! d# Z; f) a* i t*=n; . K4 u6 L0 S' j9 ~3 I) N b1 z
s+=t; - t% ?5 ?- K7 C0 j9 }
}
3 }6 g7 q; X, d5 q$ nprintf("1+2!+3!...+20!=%e\n",s); 3 n$ O+ @8 T! H
}
9 F/ N) [% g% j f============================================================== 2 ]% ^9 E" O, f9 X9 }
【程序26 】
0 e. N- v8 e5 H6 O( D题目:利用递归方法求5! 。
$ G2 o* A9 {6 c. s1. 程序分析:递归公式:fn=fn_1*4!. H3 ]4 p; d* x5 Y7 K& D
2. 程序源代码:$ g; k6 ^8 C7 a; r3 R/ X7 E
#include "stdio.h"
7 y) ?1 |- s8 Umain()
a, O! O; s) u3 ~: Q: `1 ~{ 4 b. v. m: p/ A6 F$ H; y
int i;
9 S" D9 n3 B. ~6 T# xint fact(); 6 Q9 `* Y3 B/ b2 d' E9 a7 p5 x% V
for(i=0;i<5;i++) ) e% a$ |6 |2 ^3 b; s$ |, |
printf("\40:%d!=%d\n",i,fact(i));
. h4 l/ M$ ? K! l} ( z2 P- M# i9 h* {5 y
int fact(j) 5 b- j! v. ^: q. X, a4 M
int j; 2 D7 G2 ]5 V$ L
{ 8 n8 c6 M/ ^: ^$ L: {$ c; A" k
int sum;
7 @ G* y6 f- c6 | E. ^if(j==0)
( M% t% w! _3 h- S0 |2 g, j sum=1;
) B* C Z' f6 A" p N. ]# O6 Celse 7 t: F5 u( [& r& P/ L
sum=j*fact(j-1); 7 Q4 G, g+ [- l* K2 l4 m7 P
return sum;
+ p5 J9 i- V5 ?: m: Y5 w6 {1 B} 8 Z4 g# J' [7 ~" F
============================================================== 5 k$ }0 F& p% h9 Y' {
|