EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
【程序16】 [" m$ X L8 C8 [* l5 I+ M
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
! x& C. }2 P: `2 c* ^
! @! Z4 w& |) J4 o
9 p/ M+ P+ E T" N& x. i3 ]8 W7 C1 [: a8 ?5 [! ^- q p: f( l8 L
作者: zhlei81 2005-1-22 11:30 回复此发言 r/ s2 N: P' b" E) V: G
0 ^- {. c0 |, A; f$ o3 u
--------------------------------------------------------------------------------
7 r3 u c( F2 z0 a5 }: X' P. W9 l
4 回复:经典C源程序100例
5 y W; @# v% o7 T% r1.程序分析:利用辗除法。
4 K# q/ R5 o/ k' k& I s' {" z0 v1 X* Q8 q/ Z6 f
2.程序源代码: % `+ J$ ]! z- j( @
main() # l# x+ X) O6 B0 o( \' s& s
{ , N9 t+ U/ L7 u Y b& {) D
int a,b,num1,num2,temp; 6 G) |- V) [" S. h
printf("please input two numbers:\n");
6 V' z1 D: r& S0 Escanf("%d,%d",&num1,&num2);
) F5 y/ [. @. M5 E/ D9 i) J. g( Jif(num1 { temp=num1;
- z# ?6 y2 I, a. N1 `6 fnum1=num2; $ ?- h, w0 R1 }% z, K7 A9 Y
num2=temp;
' Q# k, M) R" ^" ?. I} " i2 k" S7 q& v% Y$ w0 m
a=num1;b=num2;
( J/ ?4 q! P9 j# ^( ]7 Y4 M4 Uwhile(b!=0)/*利用辗除法,直到b为0为止*/
5 e- P* `9 E* v& `4 p{ $ X; S' J+ s, m: p, `2 u3 r* V
temp=a%b;
; m- v# s4 ~# E* C" da=b;
8 A$ f z7 \2 R2 s; ]& Fb=temp; 1 ~' t2 x7 A+ C8 k3 L$ F; Z G" k
}
. ^) R+ h0 t' s9 Y+ M( @' l3 Hprintf("gongyueshu:%d\n",a); 3 W# o0 V$ t! B. m
printf("gongbeishu:%d\n",num1*num2/a);
. @ v) X: H2 W" ?' {2 |2 U} 5 t/ ^4 Y& B: f! T1 E
==============================================================
9 _0 z1 l5 g2 H1 L" s' w9 C* H【程序17】
9 ~- |0 ]1 q- D题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 8 j1 E( ^4 K' g5 P
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
7 M1 J/ S) |, c5 a+ R4 \. {% Y" ^6 U
2.程序源代码: 0 a! q; v% i% X
#include "stdio.h" " U( \# |' l. S/ ]
main() * I' n0 c& K( m$ a
{char c;
% a5 Q4 ^, w* g& j9 s; K; yint letters=0,space=0,digit=0,others=0; # o7 T# ^ Z+ F" U
printf("please input some characters\n");
" n6 ]& Z5 ~% ~3 @7 q) awhile((c=getchar())!='\n')
# Y% t4 X9 M0 w* W/ \4 P7 ]: I2 u{
6 Q5 L# ~% T _& D7 qif(c>='a'&&c<='z'||c>='A'&&c<='Z') % H# N) K0 {+ j! ^! T7 \7 g
letters++; 2 l# \& n: M4 q0 z" a! x
else if(c==' ')
! l0 ^0 L' n L. kspace++; 0 f/ p9 r! M2 @ g' g3 A
else if(c>='0'&&c<='9') 0 M3 A/ O, F8 k
digit++;
+ R( b$ j; e$ v3 E% b3 H" gelse : C9 h" _0 Z; G1 n" Z! J k
others++; : v& Z8 L' {! @9 Z' V; a- L. E
}
) Z+ l9 E! D! I" \. Pprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
& t- f2 V# y6 n6 n4 yspace,digit,others); 3 o) j2 S6 `" ?- O3 m, S- ?! t% Q
} @- q- f; I1 H# v, P+ k
==============================================================
7 X A/ s& P$ S; x9 q' g5 H1 h+ M【程序18】
7 p. ]8 Y) j# l& I. o题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 ( ~4 N6 Y2 N5 D6 F8 C
共有5个数相加),几个数相加有键盘控制。 " R0 x* @5 D! T. g. x, a
1.程序分析:关键是计算出每一项的值。 + x( |4 k% f- e' x% ]$ x
2.程序源代码: ' `# r# V8 v% h& {/ e$ z1 e' c
main() ! p0 \& |5 v' O) X; k( w
{ , F/ B7 z; h0 o: L
int a,n,count=1; - \3 x# n2 }- C
long int sn=0,tn=0;
, S7 r' u+ M' @5 F: P9 cprintf("please input a and n\n"); : x" h1 z& W$ ~8 E
scanf("%d,%d",&a,&n);
' G' p5 R4 E @. Eprintf("a=%d,n=%d\n",a,n);
6 t, ~, O6 q. {, ]8 `$ Lwhile(count<=n)
0 P) s' \2 g" Y5 Z/ a) z( L& Q{
9 y& k! V: W) F9 w0 ptn=tn+a;
( V3 P% g/ K. o9 J3 q" j7 l# ssn=sn+tn; ; E1 s# k" S9 n l( n' h# _% e
a=a*10; - ^% r0 ^! c% i v- w* v/ K5 O
++count;
/ Z3 G K7 f) L: |7 A4 H}
" o' a& E3 O$ C1 g) c$ uprintf("a+aa+...=%ld\n",sn); $ Z5 v( @' D* ]' }, l' l
} # Z- S+ i& Z$ x+ }$ B
============================================================== 1 u# i: K! N, H
【程序19】
1 I ^" {: y8 c: Z0 U l题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 9 C: Q" a9 k6 k7 c0 Y, C
找出1000以内的所有完数。
& R! L( Z% j6 W) F4 C1. 程序分析:请参照程序<--上页程序14. * l- Y: y. y0 z
2.程序源代码:
0 \9 H& U7 ^/ M3 }/ kmain()
9 s$ |- [0 M1 H8 q# |9 j{
# h+ p. J- ~: wstatic int k[10]; - Y' E/ d; i" t# K
int i,j,n,s;
- C+ _( r2 ?0 j8 ^& V' sfor(j=2;j<1000;j++)
- x7 L2 Q$ f6 Z0 h: l% ^3 ~8 l1 {{ 0 `: ]3 b' D/ j, _: s7 G" o
n=-1; 7 s1 E0 o# S5 y2 Q
s=j; ) P/ J9 t# b3 j- k
for(i=1;i {
6 r& _% c! q: S# J2 C" Q9 Gif((j%i)==0)
9 y) g, ^7 f' j{ n++;
8 r! V2 }( S3 c( r* ~! i/ D, }s=s-i; 1 j4 U6 H/ Y9 z/ @: a& [
k[n]=i;
' D( Y/ n2 l2 m |1 t- Q/ [} / N# U5 t. J8 ~% H- Z2 |* [6 V3 m
}
" C7 p9 H3 P& z* mif(s==0)
1 s. V' G9 x, a5 O. i0 l" a, l: E' U{ " U; I$ Q' H+ f. ^2 t4 f
printf("%d is a wanshu",j);
, G- [9 \1 ]( @3 Y5 C% mfor(i=0;i printf("%d,",k); % \/ U, [. }" Y2 ^) P
printf("%d\n",k[n]);
$ ?0 X8 `1 h8 Z- _8 }9 j# r5 x} 6 H0 T1 W9 ^7 H' J1 D4 _, J
} ' a. i+ l" t6 V7 D
} 1 w: `! p \2 Q& V( S
============================================================== " _ B# b m2 O* k% a
【程序20】
' a7 c% \! O1 H! s" s# ?9 r题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 , q9 F, y, e; ^ B
第10次落地时,共经过多少米?第10次反弹多高? & j) [) ]$ a2 ^1 ?0 m& A* a6 d: D* E# f
1.程序分析:见下面注释
# ?0 s9 h$ u' `( B- p2 Q: S' _2.程序源代码:
; Y) k- [/ m5 |0 @! Q4 x2 Ymain()
) Q) e& ^5 S# Y8 O6 e, x3 \8 ~ r{
# [- z, v9 R1 P* pfloat sn=100.0,hn=sn/2; # i( k! \5 G4 @' [0 N$ k, {3 A
int n; # N! u; N; I9 J8 v1 z% ]
for(n=2;n<=10;n++) ) u# h3 n {7 C2 Z2 P; u0 G2 ~
{ U4 f: `0 t/ c5 l7 W
sn=sn+2*hn;/*第n次落地时共经过的米数*/ ' B% X. g( f' l8 ~
hn=hn/2; /*第n次反跳高度*/
2 r% `5 a3 B" {7 Q; E} ; j8 m m9 t& B( b. J, q3 g% C
printf("the total of road is %f\n",sn); 2 o3 _4 S6 z2 U2 E
printf("the tenth is %f meter\n",hn); : }. `+ D# Z8 _% @6 d$ n1 u
} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个' |( H6 X4 E. B+ ?7 u
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
8 ^& G1 S3 n: G" V; n4 v8 \" b6 E 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。6 q) l' r5 k1 }' V$ w8 G
1.程序分析:采取逆向思维的方法,从后往前推断。7 Q( [1 ~" X6 v& }
2.程序源代码:2 F- r: z4 o$ Z( G
main()
. F9 H) s/ b$ N# c0 w. |{3 f7 A+ e8 n5 Q ^6 O$ q
int day,x1,x2;, {, x/ w( E1 A' V
day=9;
+ { I. n+ B% `) Y+ Rx2=1;, G7 n% ?7 c f6 w4 A
while(day>0)
- |* F, P7 a' N: K" ~$ Y: \9 W {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/* }6 s9 Z, ] I0 j3 |: j! ?# f
x2=x1;0 e8 u# X2 H% E3 H/ Q
day--;
: n1 E7 y( W* I }
* V% v+ e. @. C& Z# H( c1 \/ g, Iprintf("the total is %d\n",x1);& k% d+ |' l; l1 I
}7 ^* v- u9 c4 N7 z8 w! P
==============================================================- f) h }' [# Z6 Q
【程序22】. w9 {. r. z& `; X/ M" r- f
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定9 Q3 _! Q* Y1 _4 P
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出/ T+ H$ d# Q1 }0 |" b. X
三队赛手的名单。 7 C1 W( T2 }6 {4 T
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,: l6 V, x* K7 F/ H! T
则表明此数不是素数,反之是素数。
" e- Y. k+ _3 n: |% t7 E2.程序源代码:% x- n' Z Z+ e$ V( R% n
main()- D t3 e" i$ ^5 b( ?4 L
{
; d0 z3 S% W3 |+ M6 jchar i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/
1 c7 D8 P7 X; [/ J' c) d Q" q% g$ Mfor(i='x';i<='z';i++)5 A3 g, L5 ~3 ^. n; l5 M+ \) \( Z
for(j='x';j<='z';j++)
0 v H, Z Y6 V8 R$ R' C {/ _: e3 S( T, ~; K+ M/ V! ]4 c
if(i!=j)
# N6 y- t# @4 I5 { for(k='x';k<='z';k++)) R7 V! [* U+ B- c; Y: p
{ if(i!=k&&j!=k)
0 o1 m/ k% k, {1 J8 | { if(i!='x'&&k!='x'&&k!='z')" J S0 M, f$ v$ o* a
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);" U5 @9 r9 O6 V' _% k1 d# @4 ^2 e
}
2 b/ U- @$ Q: N. s2 T, A: e }
7 d5 P* @9 Y9 B7 U. f* J5 ? }' [+ s6 W2 V/ Y" x
}
% V5 M7 L# j8 L6 k) v" F==============================================================
, g. Y! ^: E7 N4 G) g _【程序23】
% N ~" B! ?- B% B, {题目:打印出如下图案(菱形) *
9 y& y: P% {6 L1 s) d( m4 y: D9 N***
; p; S& G3 ^1 e& R9 A******( h2 \' F8 ]) Y( n1 K _
********
, C( w& K6 V' ^, y******
2 q5 r- n" {! s3 I+ _: H***) i8 P/ V) G( [
*2 y6 O( y/ Z f4 q
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
; h* t# ~. A; k& U7 q for循环,第一层控制行,第二层控制列。 1 l# F+ F1 N3 W. _$ m! w
2.程序源代码:* s* Z$ h, ?8 T6 G8 n
main()
; z! y; Z$ k- y5 A9 f( L{
3 r' m8 Z+ `# [ f3 j$ dint i,j,k;6 P3 T5 Y3 H2 p( n+ J" Q" Y8 Q
for(i=0;i<=3;i++)" J2 b6 V* h& O9 J: K
{, Y$ [: X" `. I8 |$ D
for(j=0;j<=2-i;j++)
2 j, \( ?1 b2 Q- ~* S( q x printf(" ");: `* s) F T, l9 a) ]& ?
for(k=0;k<=2*i;k++)
& z# T& [5 t7 G9 t2 _ printf("*");
# s3 ^4 m. {# Z' E* X2 H9 o4 f printf("\n");
+ j+ n0 v$ u! |6 _ }( i6 M2 @4 W) j3 z
for(i=0;i<=2;i++)
5 g6 {/ I6 A7 {$ L {4 U I4 e# U1 k9 T
for(j=0;j<=i;j++)
- u8 H5 i) i/ V5 i printf(" ");
: q1 Z6 X1 w% q8 B for(k=0;k<=4-2*i;k++)7 G4 i$ c! D. J7 f# d" _ f
printf("*");* B# J: _6 \8 ?) d5 `
printf("\n");
: [8 Q, ^5 Y! R- d- M. C. g% F }" I) \+ \& `, ]3 m7 |% F Y
}: U5 B" E: R, \8 }
==============================================================
8 t# c! j2 q; {/ j! _【程序24】
; t5 R" i. q# F! q& w/ w题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
, p# m+ a7 o) s# F4 Q1.程序分析:请抓住分子与分母的变化规律。
/ w# O6 h% N' d2 Z7 Q2.程序源代码:
; z9 h: a8 _. ~, \" T# mmain()
% I, m, q- ~8 J& r9 y2 |{
3 E: L2 M( E$ c# d7 ^/ Tint n,t,number=20;
! c( C8 L7 K8 x6 `8 B8 |' Afloat a=2,b=1,s=0;
) h& `! `$ v. ^1 gfor(n=1;n<=number;n++)
, E( Y" s. L* I {
3 F8 X E% \. v$ h& w s=s+a/b;5 R' d' t; |9 U, D
t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/) [; Z3 ?- |6 [! U$ R
}
6 o4 N' @1 `% W/ J o8 s0 Z, P) L- Gprintf("sum is %9.6f\n",s);
% P6 I4 ] M7 w4 z9 k& [5 }} b- a" n* i7 X4 e
==============================================================
* x' Q* l6 |4 Q【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要 w6 ]1 g0 \" a7 G+ @+ t5 f) B
题目:求1+2!+3!+...+20!的和
! k4 h6 t! o" B. h1 E9 k1.程序分析:此程序只是把累加变成了累乘。 1 W# H3 L# q' S3 K
2.程序源代码:
6 s- Z% `3 z9 D$ D& {7 ^$ [3 d! Fmain()
: o9 V! [ X/ B w5 `" G{
) _' W" ] J: Q8 Cfloat n,s=0,t=1;
C# j& i& u- ~9 l" c* N1 Yfor(n=1;n<=20;n++)
2 [9 ?: y8 e& u2 \0 } {) `( F. Y+ f6 u! [( ?
t*=n;* |# C) {$ F& ]
s+=t;
" u, s2 u8 A' a2 e }
: d/ e- S6 z2 O/ p- q7 uprintf("1+2!+3!...+20!=%e\n",s);" u# K" B9 Q {2 |: @, _
}" t" b1 v! |- t6 G
==============================================================
{/ O Z' R! ~: I9 z0 D6 Z( N3 }【程序26】
6 M& g$ b3 L+ K, v9 d$ ?题目:利用递归方法求5!。9 g/ m$ A7 N+ N
1.程序分析:递归公式:fn=fn_1*4!- X& M: k: {4 J! M* [$ u. X
2.程序源代码:
3 h7 U: E7 j+ [/ x0 [2 K#include "stdio.h"
0 \. t# \7 x% X% h3 kmain()" P) G6 e8 t* X0 \3 T S
{, t5 u ~, D L K
int i;' O4 m3 v1 V% j5 ~, I
int fact();( A6 l. e) L3 ?, H$ d
for(i=0;i<5;i++)$ ?7 n C) T. z
printf("\40:%d!=%d\n",i,fact(i));
% g- n L! C7 ?0 m$ N7 `}+ P- m" x+ d' l1 F
int fact(j)
3 j' k, X/ _! S- n3 r7 J" l& Gint j;
( g3 m! a7 C: x2 F; ~) q4 b# P{8 U3 r! l% p5 m' j
int sum;: G; Y! @* }4 S6 i! ~
if(j==0)- w. \) e! A/ S+ ~- B4 L
sum=1;
T2 T3 G+ ^* i$ N2 d0 R' {else
+ s& {1 x. V; T& L) d+ U$ h6 n0 c sum=j*fact(j-1);6 e% {( l# A9 ]2 C' P6 L: t. H
return sum;
/ ?/ t6 B2 d! g1 |! S. [}
' M- j/ ]- T5 x8 `# {5 T============================================================== 9 M' D) T, [) D1 a! [
|