EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
【程序16】
7 ^; R6 `# V4 V$ g7 f: o7 n题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
# a% Z% w6 {7 L" `6 g1 T- s6 [& i5 [) D! k% p
7 u% b$ G( f \3 V: _0 z5 D: l. Q+ ?7 l
作者: zhlei81 2005-1-22 11:30 回复此发言
! g; h! x5 q5 V1 ]5 c2 T( w c! s& Q( a; d, Y/ R7 T( ]8 N, \7 h. a
-------------------------------------------------------------------------------- $ ?' s. l. L) U
& }# r$ n- {& ^; d/ d( ^4 回复:经典C源程序100例 ; y* c- ?9 c2 y- f N: l
1.程序分析:利用辗除法。
7 Z y, Y" Y, G- I, O
. _7 b' H/ l% h+ c* B3 M2.程序源代码: 1 q, R9 ]/ |) x5 I
main()
6 a9 H$ x6 {* H- I, k{ ( O) e- s" P0 [
int a,b,num1,num2,temp; v1 E- O% t* Q6 t4 P# z
printf("please input two numbers:\n"); 4 F( H3 T) h% j, F& n
scanf("%d,%d",&num1,&num2);
4 \* M) C- P* X4 c I: sif(num1 { temp=num1; # @! L/ j9 b: s9 u: A
num1=num2;
- }- {' T* Q+ Z9 tnum2=temp;
+ J1 z7 A" s! n3 e6 E}
$ c, a3 A5 b4 q3 B" Va=num1;b=num2;
8 E4 [& B, j0 I3 l, `# Uwhile(b!=0)/*利用辗除法,直到b为0为止*/
( v3 n0 ^1 i4 `{ . b3 b, c/ j3 D. }2 c! ?
temp=a%b; 2 D8 u: m/ P% W# }% _. ^
a=b;
9 \5 q4 ]+ c/ ?0 gb=temp; 0 ?2 z5 R4 W& _6 G$ U- x0 M
} 2 w/ w' `( D& I
printf("gongyueshu:%d\n",a); / e* x8 K; e0 a) t( {! X
printf("gongbeishu:%d\n",num1*num2/a); & F' g- T& N9 y2 G3 D
} + F& W! T' z" ]; V6 c) \
==============================================================
& r- Y) W5 F' J7 L- M. y. R* V【程序17】
$ ~6 P6 r f" h0 m" U题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
( Y* U! [% B" J+ D n: i& e1.程序分析:利用while语句,条件为输入的字符不为'\n'.
( g, b; h U9 x/ |; M
/ X! d# \1 Z) @2.程序源代码: 1 j5 ?# C+ z! z" A
#include "stdio.h" ; C; j+ `: }; O" X7 {! A- `" n
main() ! m8 n* A4 }( l6 O+ {* \( X
{char c; # x) [7 l1 y" m: P2 k
int letters=0,space=0,digit=0,others=0; / S2 N8 P# l \# t
printf("please input some characters\n"); % ?' R5 y) _9 z: G1 i+ U# O9 S
while((c=getchar())!='\n') : t) C; a( M$ f0 o
{
4 D8 e4 a( N# ?- eif(c>='a'&&c<='z'||c>='A'&&c<='Z')
" M: v, }$ n( H+ e& jletters++; 8 N' W3 C% Q) B3 u! q# J" [
else if(c==' ') 3 g1 Z0 U6 w5 Q4 p" B! r/ _3 L& a
space++;
9 o w' x$ i* g( @0 p# a5 Oelse if(c>='0'&&c<='9') 8 ^' M% {' q( {3 ]0 a4 k; w; I& F
digit++;
$ Z* ?7 U \, r Y. }. Y2 W. pelse
l p7 c, S6 }# fothers++; + [8 \ u2 J. D% y/ u9 Q) c5 }8 ]3 E) Z
} 2 x2 Q* x( L7 |5 F3 J
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 5 t1 l( I( ]! ~ ^: y; r- u$ H. ~
space,digit,others);
6 a9 T& k( J' b/ A- w3 G+ `; X5 t8 D1 ^} B8 l7 g4 R5 ?$ J1 X! ]" u v+ U
==============================================================
$ h$ X( N3 a6 v【程序18】
: T/ F5 ^9 }8 O) @8 o题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
+ J# d- p0 L( p共有5个数相加),几个数相加有键盘控制。 $ a, A! M5 Q3 Q0 m
1.程序分析:关键是计算出每一项的值。 & w& Z- }5 B2 ]- V/ Y
2.程序源代码: 8 m) _! G. a- Q) e# g" S X
main()
! @6 Z8 ~/ |. Z- k+ B$ ^9 q) ^4 f{ 0 D! T2 y9 R! K3 ~7 ~4 p
int a,n,count=1; 5 {. _! m0 w# C2 f- B8 }
long int sn=0,tn=0;
) ]4 [! a) }; A# t4 dprintf("please input a and n\n"); * i1 z7 R5 v8 N2 e/ A5 U) e5 C. V t
scanf("%d,%d",&a,&n);
6 @. W( @7 V( m l2 I9 ?* g. mprintf("a=%d,n=%d\n",a,n);
, I! @0 Q" W* k! nwhile(count<=n)
5 e4 Q# L# Z, E' S9 ~! g8 U{
8 _% N6 V) J% Z: C/ {5 f5 n2 ]tn=tn+a; : N' H- z+ s3 ?# X5 B
sn=sn+tn;
! j& c' v. @" c1 \a=a*10; ( |1 {: v8 m( z3 B N3 l/ v
++count; 0 K, t! D8 _# Z2 [" R7 D3 S& l3 S
} B( K' l! F; `( h. K+ w
printf("a+aa+...=%ld\n",sn); / B% V% V8 t& |- D! t0 y
}
( f( A1 N2 Q+ ?$ u, H& F/ I============================================================== % d0 o1 V1 {+ O( L5 I
【程序19】 / S6 p% }3 V, {' ~9 G6 m( [) @
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 $ E1 t& H# P, n# [2 C
找出1000以内的所有完数。
) Z N" m) x. O1. 程序分析:请参照程序<--上页程序14. . {- {! F, @0 g* V& b/ z* ~( Y$ w
2.程序源代码: ! \: \7 T! H! j9 p
main() ; p4 E( `, V8 j) `/ {& V
{
' z2 q3 t3 a$ C0 Pstatic int k[10]; 3 ?! Z$ \) T* t, x
int i,j,n,s; 3 Q7 f1 `5 z+ s$ z3 ?3 X" {5 I: ?
for(j=2;j<1000;j++) 8 k4 D# c( w0 Z0 P
{
/ t% ?1 B _& J* I( J1 dn=-1;
( O# x% H3 `6 `s=j; $ \& i6 u& S1 `1 J' L B/ V
for(i=1;i { 2 e& \% |" w9 Q4 d9 m5 G
if((j%i)==0) ! X m) L* w5 z& M( s
{ n++;
`4 q- U" k5 l5 V1 r+ \: Ss=s-i;
7 M6 T* a9 u, C6 W8 Y" I& ]3 Ik[n]=i;
& m( s- k* d$ ]" y% M0 ]5 O} & s% { a& Y# h
} ' q1 F9 X0 B6 H: p) |- n$ v
if(s==0)
5 d, J" A+ M9 m' j" x{
. D) c' v3 Z% Oprintf("%d is a wanshu",j); B1 B# P, s5 l/ l# x9 q" M' E
for(i=0;i printf("%d,",k); 8 i& C4 I6 @8 N
printf("%d\n",k[n]); * B8 S3 q" F" V0 H2 J( ]$ ]
} : h9 V) Q; i. [4 M! R% _. I
} 8 ]) d* l3 A8 P% I3 S
}
% G v! X, n1 H7 r$ v============================================================== ; H2 l7 B4 |' s% f r
【程序20】 & R8 i4 _2 ]( N/ ~; D
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
4 E/ X% k# q# }2 E" `第10次落地时,共经过多少米?第10次反弹多高? . J ]( _, h, D$ A8 k, M3 G- } ^7 R
1.程序分析:见下面注释 / t. }$ z# ^' `: ~
2.程序源代码: ' `" y+ u% K& \# m
main()
W. {" M1 @) n- @1 x8 R0 V6 w{ . I, _1 ]) z2 S" z }
float sn=100.0,hn=sn/2; # k% M" |9 f1 ^$ ^2 J8 m" K. E
int n;
( }! b5 O1 V" X2 ?' ^* d% t1 _4 Kfor(n=2;n<=10;n++) . e& B" Q+ G3 F6 k! h
{
/ u1 d: y& [7 F+ i, Vsn=sn+2*hn;/*第n次落地时共经过的米数*/
7 w& f% |$ O/ z3 F6 i1 E+ L" t7 Khn=hn/2; /*第n次反跳高度*/ 1 ?) G- y, `2 T$ b5 t+ C/ y
}
0 r# H [3 {$ J/ ^. n. X2 A, Mprintf("the total of road is %f\n",sn);
. t4 S+ Q9 W" X: X9 J2 w2 W2 {printf("the tenth is %f meter\n",hn); ; x' A# Q4 ]7 N+ H8 U, m
} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
: ` X/ o5 f: K" D 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下% n: Q- N) h' ] u, Z1 n) |1 v
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。+ a, w/ M# \, O1 d! t
1.程序分析:采取逆向思维的方法,从后往前推断。
4 z( J& H3 U" q% D7 {8 Y: _2.程序源代码:: I4 X4 |2 t( w: D9 x# L' e
main()4 i+ y0 L4 U. }
{3 D3 P1 ~: K. v0 X( T7 b
int day,x1,x2;
1 L0 v6 o0 D C1 Z m% wday=9;
5 B$ a9 G4 F, x; C& e& u4 u4 ]8 sx2=1;
# |2 f6 M$ d7 S, ]8 V" t8 Xwhile(day>0)* X! H7 w$ A+ t" T7 S; Y- x
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/( J+ j1 ]% R) g0 n( `9 p
x2=x1;
6 T z# @) _. I" { day--;
# d$ G5 ^4 l% P }
0 \! g3 z/ y7 ]# M( dprintf("the total is %d\n",x1); h0 N Z" |$ H. N
}' d. u' R8 F7 W: p2 R
==============================================================
" s4 q/ K4 W8 ~+ o7 f* \1 ]【程序22】- D0 E& H8 l2 a* Q) f
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
& X9 p/ f" l4 [# n4 g2 w 比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
2 @% s R x D, _ 三队赛手的名单。 9 s! y$ h! j/ Z4 _# I! u }! F2 P
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
6 j5 N9 f O) [% q2 {$ {' o5 g( S 则表明此数不是素数,反之是素数。 5 n# z' O3 f7 Z- `' t8 w* p
2.程序源代码:9 @- y4 a* Q2 K( }7 b7 H0 ~
main(). V2 O! g. t* }$ ]' `1 v- s( C+ J# Z8 I/ e
{
, N! N i7 J9 p- M) g: w% rchar i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/% O2 Z0 C$ I0 c: f. f# n
for(i='x';i<='z';i++)
/ a) I1 m4 D# {: j5 j' ~ for(j='x';j<='z';j++)8 S. c. h k @( Y+ i
{* g+ a0 X4 v% S9 C: M% Y
if(i!=j)
. W4 A% x/ B2 d/ s; K4 `+ {: d for(k='x';k<='z';k++)" G0 i+ I" ], {& U+ c
{ if(i!=k&&j!=k)
8 w. U3 |# ?6 E( h { if(i!='x'&&k!='x'&&k!='z')
' ]% [' c( I2 t" m/ T printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);% ?5 A3 R$ g) O$ ?3 f9 g: ~
}
8 H" g& B" ?* F5 s: Y9 G }
# _, Y' R8 u* ?$ _5 d }
: x& p0 X, ~9 W9 R' I/ G8 r}% O% n9 e4 Y, ?9 n5 O d& @
==============================================================0 g3 o ?9 U5 O' {/ b& j
【程序23】
& u! ]% w5 ]& U' B. l- u4 O- a题目:打印出如下图案(菱形) *
4 s6 r1 C2 P+ x% T***
" j& N i! y; K# y t******
/ p: z# z, R) D' a+ t7 X********
y" J# J# [) i8 j******* }) X' L* \$ T+ z0 u/ d4 r& z
***
z5 y, i7 j! ] m1 W- e*
8 s1 B( y( V2 N1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重1 C4 ~0 D- _/ M
for循环,第一层控制行,第二层控制列。
2 t0 b9 L) ^; G6 a6 W' a* r) O2.程序源代码:' z* Z" e: L4 Y
main()
4 {! C9 P. F8 i4 ?{
+ x- }( f" w& [int i,j,k;3 `) c$ E+ @9 K* m# z
for(i=0;i<=3;i++)1 l" c. f7 o) A, @ @6 k* ~
{
4 l3 Y& Q0 @. Z for(j=0;j<=2-i;j++)
: v* q% {2 O+ T i printf(" ");
# |! Y6 S6 t, U* m" `- i, N for(k=0;k<=2*i;k++)
+ n' v" J$ L. u. g" Z, e* P0 W& i printf("*");1 h6 h. K+ p7 x& ], _) ?
printf("\n");9 c5 S& Q+ S& f( K# v" i- S7 u
}
4 p: Y8 V2 c0 y$ r( Pfor(i=0;i<=2;i++)
- P# p( c! _0 c$ J* ^. V {
# A0 U" H- G% ?7 ]6 N6 {; P( | for(j=0;j<=i;j++)
* Z- @; B9 C( \3 U' N* l$ ]; j printf(" ");
4 q! f- p. Y/ N3 p' f for(k=0;k<=4-2*i;k++)
& `. [, ~4 l# p2 \4 Z printf("*");
$ |7 T0 \ \/ ?; a: h printf("\n");; w; S% e; Q( W
}
9 y2 ^% O5 K, d; Q}/ l3 C- _9 {. c
==============================================================
c5 s% F% \; K9 A& J【程序24】
' V8 _8 x/ P' Y4 @* p( [8 _) q/ I- @题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
9 [8 \( [* w% m9 G" w1.程序分析:请抓住分子与分母的变化规律。 / s- m* m5 b# r& ]4 D0 ?. t& ]
2.程序源代码:
# V$ e) T8 e# t4 G \main()
% r+ T* x# h8 e9 H: B{
1 G# q: J& z: g. c# [/ G, fint n,t,number=20;" ^1 r# I% T$ J( }6 L/ u$ [: J
float a=2,b=1,s=0;( X3 {5 X3 S" g, L. i2 |
for(n=1;n<=number;n++)
# D) H; V5 L3 I8 l: D {7 o4 @' p0 H$ J: c
s=s+a/b;
7 r. V9 F# W& r0 I; V; K! n t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
/ X, t# x3 Z+ l) D. o% U5 o }
/ M2 I5 x& O0 ]1 J8 L$ v- gprintf("sum is %9.6f\n",s);$ t8 `0 e' a- G# B9 A$ R
}& U# ^2 J9 W9 ?
==============================================================
+ ~9 h+ V/ v9 B7 ?【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要
# x/ k2 s0 o. V$ Z题目:求1+2!+3!+...+20!的和
7 ]$ C. f3 Y) ~1.程序分析:此程序只是把累加变成了累乘。 & ^7 `4 m( \% S/ L; L+ [
2.程序源代码:
7 N! \7 x6 z' C* d* dmain() P% G! C# c1 Q% Y8 c$ p
{
9 k6 ]) [* j! [+ c2 X7 Nfloat n,s=0,t=1;) V6 w# ?' j+ z: Z
for(n=1;n<=20;n++)5 F" {" K7 [; x
{5 C8 N) ~: j1 l- F; N/ V
t*=n;
" n. C* O6 U+ }, v$ d0 U( N s+=t;
! N5 v' j* |6 b7 { }( [% m" G" B8 A9 \1 `( J
printf("1+2!+3!...+20!=%e\n",s);( R% a! I( Y' y4 x7 s, a
}
9 \ {1 B" o6 y; U+ u4 J==============================================================) o" G& N" b& k& f9 N* w
【程序26】 ) ?" s0 u# {! t5 u6 T8 X
题目:利用递归方法求5!。
- s+ D5 O. y9 d7 j; |1.程序分析:递归公式:fn=fn_1*4!
+ |$ x) v" |+ X! F2.程序源代码:
4 a6 p( t) n; A- @0 b3 D6 |#include "stdio.h"
- G" E5 X/ |7 C3 h' \1 Nmain()
8 Y' C( o$ B9 `! O4 h1 k{5 |5 s; Y- ]- o, }( e! U1 {
int i;
( W4 x( h, z( Sint fact();
) d0 c0 M5 Y' L# ^for(i=0;i<5;i++)$ N) ], \0 r* C5 _+ Q" L. o2 Z0 D
printf("\40:%d!=%d\n",i,fact(i));) H# \* A0 r; l0 Z
}
5 B+ f6 a! M9 h3 c7 |$ p6 Zint fact(j)
9 N. Z6 o7 v( [ X8 qint j;
! y& f8 ^& {* H- l3 Z0 R{! ~2 g( s7 f9 [% n9 Q0 S: ^2 ]* `6 g
int sum;
; j2 a: u. ^$ X# g$ Nif(j==0) `8 o1 S) z$ ^4 E
sum=1;
9 V: [ m5 b& J0 {else3 p! B5 s% t; [
sum=j*fact(j-1);; E5 c4 i$ G) X7 g, \+ F7 o
return sum;% g/ t' ]- W X; P& _+ L
}- @, ~$ ~. D5 R
==============================================================
- |# i& A# z9 }7 d |