EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
【程序16】
% a* ^* w7 E3 s( b题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
0 v' q; h% r! D
" K2 p6 L- [1 e0 u5 S' b& E
6 {' c. M$ U& |
8 y* k+ p" I! u8 V/ p作者: zhlei81 2005-1-22 11:30 回复此发言 + ]( f( h4 \& }3 |+ w) M2 M
& X% x# F) L- G" Q% ?; c% ~/ K--------------------------------------------------------------------------------
r# l5 ?, a3 F }- c) L( p) g
0 F. o; ]; k" X. y5 G4 回复:经典C源程序100例 0 B# j( M. E) p! I& B$ A. U
1.程序分析:利用辗除法。
- d% @1 t% n1 ~& E/ @2 W8 d' I# H I# d
2.程序源代码:
3 ?' g3 z% {% ]main() 0 W0 c( ^- X8 Q( U" A( {
{
' g/ b6 |) D% Y' p8 S7 n$ Hint a,b,num1,num2,temp;
# f6 I G5 s4 w- V( K Yprintf("please input two numbers:\n");
2 a$ a. k, a9 ?2 s, tscanf("%d,%d",&num1,&num2); ; n6 ~2 b* T+ F* w4 ]( w
if(num1 { temp=num1; \* ~8 @ |2 s! @& G( w8 c
num1=num2; 7 S+ z' c3 }+ u' _6 P+ M, i: h
num2=temp;
! a. G6 C& v: ~) }}
* C) ], X" G) t3 a7 va=num1;b=num2;
$ ]8 ^+ [& Y: r( T8 H: r) |+ Vwhile(b!=0)/*利用辗除法,直到b为0为止*/
/ o* a# `6 Z* c( S- b) ^{
( A) @3 g, V2 \. y. P! Mtemp=a%b; - X8 |# S+ B, o- U) }
a=b; , l8 E0 [( B7 f! F& K8 p) V
b=temp; " U: M4 s; F) |" q {; U
}
" x- `; _0 b+ g4 {# lprintf("gongyueshu:%d\n",a); 1 r/ U1 Y# }# [! |7 H
printf("gongbeishu:%d\n",num1*num2/a); 6 V& S4 H. \( Q
}
7 |3 O! q: A8 x" s) a4 K# ~============================================================== ; S; V; o& E4 k. P# i- N1 |% \( h3 F
【程序17】 ) n- A$ D+ `' T S- f
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 9 @( I+ C( T% G) l9 h, @
1.程序分析:利用while语句,条件为输入的字符不为'\n'. ( @; j. Z4 f; O- [. ]. a
. e- x+ R" m3 J6 Z2.程序源代码:
' ]* |: d; e- @7 N4 j" d2 B#include "stdio.h"
" U) l% y- L6 o. H+ T7 p% |main()
2 I) r$ o# i3 G1 S6 v( z{char c;
0 Q9 t+ o2 ~# X5 M0 u& Iint letters=0,space=0,digit=0,others=0;
% R) b0 S( T, T2 U4 B2 Aprintf("please input some characters\n"); - E& i" i% L! Q" N% q3 B
while((c=getchar())!='\n') - l0 a# ~/ R# I5 [7 G( F- i% v
{ + b; ^$ \: r$ B+ G5 s
if(c>='a'&&c<='z'||c>='A'&&c<='Z') 7 \6 _8 A9 l) Y- M6 I) x `
letters++;
) }' o h. n5 Lelse if(c==' ')
0 V9 p- I' B3 S0 F: O+ Jspace++; + v3 {5 A) [& R
else if(c>='0'&&c<='9') - @5 _5 Q; F0 l4 q: U. d6 u9 H" o' ?
digit++; 1 q# Y" i- Q$ v$ V& n$ Y& Q2 ?$ A
else
. U5 w7 Y) r- J6 V! I/ \others++; ' y; |/ x* z2 T8 t4 K3 @1 i
} " o, U( e" q. L8 {5 l
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 6 e" }9 F N9 V, O+ {' r) A
space,digit,others); & x) \, I% M$ E- y1 z
}
- t6 o5 P; s8 v" ~ ], \) h============================================================== 0 |) h' Z, o# q! [* ~+ U0 e
【程序18】
/ K7 K/ f1 c: U! d* y& I) u" E题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 $ X1 W& l; f! b5 C! A& N
共有5个数相加),几个数相加有键盘控制。 $ G6 w" j5 p ^& X7 F4 S2 h, M
1.程序分析:关键是计算出每一项的值。
% _. y' T4 ~/ A: x" J. h) J2.程序源代码: 4 l2 W' Y" Y1 `
main()
0 U5 c7 V. s( Z1 c; s0 I{ 7 T( s8 T0 B5 R4 z% r
int a,n,count=1;
4 Q4 M7 P" {0 a9 b% E* Jlong int sn=0,tn=0; L( C+ O# `/ a( T
printf("please input a and n\n");
) x# B- U/ @% J! B2 Wscanf("%d,%d",&a,&n);
; k2 C( \: j# D5 o3 c8 vprintf("a=%d,n=%d\n",a,n);
6 h* q' R1 J! K1 N, g$ kwhile(count<=n)
' s' t' A) w; w( q; I; H7 {{
/ \% H9 Z1 G+ M$ Rtn=tn+a;
" C; e2 i2 m# C& }sn=sn+tn;
8 P: T: R V! O Aa=a*10;
- |7 ~8 X% w( ]# J b: N: V++count; 1 q6 Z) E; n. t6 p1 i
}
& |# ?# ?4 ~2 z( Pprintf("a+aa+...=%ld\n",sn); ! W8 w5 C5 I4 L
}
8 k5 G" T. F% J==============================================================
6 A. t) |3 D6 `$ H. d3 ^【程序19】
h1 H8 I. q- g+ e9 p题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 $ C7 e) y3 D" o
找出1000以内的所有完数。 2 D8 e! G3 J4 ]7 g! \2 P
1. 程序分析:请参照程序<--上页程序14.
* t6 d# F `( t- J- R2.程序源代码:
0 O. R# J9 A. {) a& Y$ ymain() : A$ v; b1 k' a4 W; V o& A
{
1 A6 ?8 i0 h' R3 n0 ^static int k[10];
K) Y6 m2 v- W7 i. }8 ^int i,j,n,s; ' P) ?9 b, s7 D" ?
for(j=2;j<1000;j++) 1 Z+ L, g3 V0 F9 W5 Y$ i+ `1 o* O
{ 9 Q6 e# s( F1 L' c
n=-1;
% p) e4 A; j* S; |4 C, V/ }/ [0 Ps=j;
( w9 U& _# `2 r2 m9 i0 C5 `for(i=1;i { 4 d) B4 l# a8 l8 F% Q
if((j%i)==0)
E, M% d! I9 q6 `4 T+ Z+ G{ n++; 4 t8 `. P+ ^9 W- r) X) T
s=s-i; : i6 W( I4 I; K; ]; e' Y2 _( I
k[n]=i;
6 s u3 Z/ ~, j/ |* k* T0 M9 l, @} ! s( n2 M5 q7 [3 \9 \
} 1 m- s& k4 B! Z; e9 U0 v
if(s==0) : A% N. C1 j. v/ J
{ $ z7 X3 |: Q% `0 I: _
printf("%d is a wanshu",j);
# F# E7 @/ y o1 @% U. afor(i=0;i printf("%d,",k);
, u9 U- \+ d) ^' M0 _printf("%d\n",k[n]); 0 A. [: A9 b; J
} ' q% g& C# {2 W8 S+ {' J& V
}
' J9 E" A6 u! _) v* C}
4 @) G! O, h, E/ P5 j, z) V==============================================================
3 y% y& E$ j. U【程序20】 6 p2 b6 q5 y! R
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 $ s) D. G) u, q% R
第10次落地时,共经过多少米?第10次反弹多高? / Y" J( T% k4 k( X& O) [
1.程序分析:见下面注释 0 ]! ]- `# o! W$ S" t( K
2.程序源代码: - K) s2 g0 H4 ?& ^5 J! k {
main()
+ s+ z) |) B, e; N{
1 D2 d2 R2 B! z) d) t. ~float sn=100.0,hn=sn/2;
2 V$ _9 z _+ Yint n;
4 M X! r( m: E( s$ F9 ~for(n=2;n<=10;n++)
" ^* b+ \: A5 E' B{
& L ?+ P2 n! |" Q; V5 P- esn=sn+2*hn;/*第n次落地时共经过的米数*/ I1 H6 z, I8 N
hn=hn/2; /*第n次反跳高度*/ # Y0 P" O8 y, B
}
7 A% J+ _ S$ G0 _6 kprintf("the total of road is %f\n",sn); ( P- L1 @0 N, k
printf("the tenth is %f meter\n",hn); 8 E: B/ ^6 Q; M1 C' ?/ I$ Q7 f$ Y- R
} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个4 {. c" v- J4 c
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下3 s$ z6 j/ V, }- H9 C I% ?1 H
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。, S/ b- ^. k2 ?8 W6 s/ Y
1.程序分析:采取逆向思维的方法,从后往前推断。- `( V- [8 s- a
2.程序源代码:2 R9 C2 o$ Q$ e2 E
main()6 {$ Z, ^! w) G, O
{
$ g4 U4 P- O. Q3 v: {int day,x1,x2;
# F$ P$ y* d& v/ h6 `0 O$ Yday=9;0 K& ]) ~; F; g! g
x2=1;+ _2 S$ \, l5 r; \+ u1 {
while(day>0), d' u5 o, t) ]: c% z L, ^
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
/ C6 t4 ^& H( c% H9 j x2=x1;. n d" R/ v5 f7 s& l/ }" d7 l
day--;- z ^8 D. j9 o2 u
}
* {: h& Z D" `printf("the total is %d\n",x1);
7 [! f& U3 @0 e6 ^, a# c}# w2 L# w$ G6 w g) {4 g, T
==============================================================3 \ K7 K6 F" M3 J
【程序22】/ z& V/ \& K9 U) `* ?
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定. m# ~! k4 S9 ?' q* p
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出' K% g& x; p6 |. N5 h& {' {. [. |2 C
三队赛手的名单。
' O/ z4 Y4 Z. q. Q" |* t v1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,! `! _# }% r4 |- C8 `
则表明此数不是素数,反之是素数。 + q# {7 Y j- z. }
2.程序源代码:
( e4 ^& p0 H6 _# Q+ Nmain()
3 R6 B( g$ y, T{* A! {) o! d5 I
char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/+ q0 I2 L, r1 \# E2 `' U3 \
for(i='x';i<='z';i++)
3 L' M- d4 i. [1 s+ J for(j='x';j<='z';j++)
4 Q8 X& e2 z1 U5 g* k$ m, { {
+ \- x2 R' a7 G* D: a1 D if(i!=j)' P% h' Q% _: }1 y- a& ` {
for(k='x';k<='z';k++); T6 M$ h" Y0 M; a
{ if(i!=k&&j!=k)
2 _# w1 {: @' A { if(i!='x'&&k!='x'&&k!='z')
! P5 o( V/ A+ P6 |- N printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);% e7 b, [; J$ h9 J$ N; |7 b
}
# h4 p) ] _: J N5 J. |( L2 [ }
, I* u1 ^0 e6 a% I5 {8 c }; T2 s3 P0 z, q% n- @$ T
}/ A' U6 S# m2 |: V
==============================================================
' W, _6 d E$ p9 M7 M【程序23】
3 X9 z* k# z3 C, ]2 |' z/ ^题目:打印出如下图案(菱形) */ c3 ?# @/ U' |8 f
***
- c% N2 B3 G$ A2 B******* M( u" m+ \+ D0 p& c
********
9 _. m6 L3 n" X u7 ]******
; K2 s7 h( d/ E0 O# u5 a***
9 Y) w @2 k: U+ v! `5 U*5 N. Q0 c* S# x+ r
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重2 G4 M [ z7 ^
for循环,第一层控制行,第二层控制列。 6 L: j# E3 i3 h9 j1 ]
2.程序源代码:
1 {, _. \, k- g2 p/ Y0 K" o/ Vmain()* |( ^: @- |( [* R
{6 G4 e0 t1 F! t" z j# U- ]$ Z
int i,j,k;
5 N, ]" U3 n4 Gfor(i=0;i<=3;i++)( R( A. ^2 m* M8 R/ c
{
( j# K+ B# U7 F: F: v4 { for(j=0;j<=2-i;j++)5 ^8 N: I/ a! m: B% k, x- Q
printf(" ");$ Z- t* [8 u# o \: S* G
for(k=0;k<=2*i;k++)9 B9 X* Y; P% `
printf("*");
" _; O R$ u0 V+ T6 b printf("\n");' F4 J" n$ G: b# y
}5 F0 K& G% k4 d) e* p. Z+ z, ]
for(i=0;i<=2;i++)' o+ a: `* T; P- t* T# o; k: Z
{
) P! Z5 _4 j2 [3 G; d2 j for(j=0;j<=i;j++)
# P% r' N% W$ y3 U0 t1 p printf(" ");, B" d) u! P% S) s R
for(k=0;k<=4-2*i;k++)
4 T& f, g k6 E. v* q: ?0 O printf("*");
2 z) G/ m; }" h9 T3 @ printf("\n");# w2 L" L* n( Z; |" Z
}: w. C% A! J) {
}
- E5 R5 P0 ?9 [* z: m==============================================================: Y- A2 z7 W' X
【程序24】 % M, W- n' E: v! h
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。: E- v) B! _ z7 w1 u- m C+ L
1.程序分析:请抓住分子与分母的变化规律。 8 s4 W, L! C: j- R! |
2.程序源代码:
4 |, Z- y# K9 c# {9 Gmain()+ L- f* _6 E0 ^9 Z4 Y; f8 R0 \# C
{. V3 [" R" q" X: X
int n,t,number=20;5 p- a9 A- L6 \/ h
float a=2,b=1,s=0;
& e+ I8 {' v/ x' C: ^for(n=1;n<=number;n++)0 M5 e/ F. r" F& M6 k
{
+ R$ m2 p- M0 C: f s=s+a/b;& c9 o+ @- a m M4 [
t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
5 l% J" L; X8 T. v4 N }
$ x1 L( B/ V3 Z; t/ Z. C+ ?- Wprintf("sum is %9.6f\n",s);! S4 Y) G { X W3 S! `3 ]( w
}7 G# \, a" _* r5 F
==============================================================0 r& V& _& R- n1 r/ w7 Y% i
【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要
0 Z: b* m: z" ~& h. Y1 R \" @ c题目:求1+2!+3!+...+20!的和
7 k7 m K+ j1 h/ E1.程序分析:此程序只是把累加变成了累乘。
- b0 r9 F& f8 B2 O- A2.程序源代码:7 J7 G) N- c3 r, Y6 ^; H
main()9 u1 h5 C1 k& o3 P# z" v# o
{# o$ W6 M U0 ^- W5 O* A
float n,s=0,t=1;
- \! c, l+ Z: `+ F: mfor(n=1;n<=20;n++)7 E0 e- v4 j& U0 k7 p) H& n% x
{ Z, n' o8 T8 s4 }, |' {
t*=n;, P* z: S8 s. c9 ^8 Z4 ^+ n
s+=t;3 d0 O( d4 O" Y+ R& c S5 k/ J
}! D; k, T+ N; [/ L: D0 t( D3 I" L
printf("1+2!+3!...+20!=%e\n",s);
H! i1 k7 c1 U) D5 _}: W( Q& x2 ]9 ^7 g% `
==============================================================
3 m' K5 C9 C7 R# }$ B【程序26】
4 d. h4 y. q3 r0 o# E0 b& d9 }" e题目:利用递归方法求5!。( D( F1 O" n3 M$ c$ w
1.程序分析:递归公式:fn=fn_1*4!) `& n1 f! C/ c0 q, G; b( i
2.程序源代码:
1 Q" S4 J$ ?' [5 A1 m9 @' C* x#include "stdio.h"
8 s/ k' _/ F; l; { d, Cmain()# x9 e0 C- N( v# Q! X
{( z5 W7 T3 ?0 T8 M# ^
int i;. X) S/ m, m& S9 n& r
int fact();
% `, h% {8 @' s/ v+ V! ~- @- ^for(i=0;i<5;i++)! G* F; n; j- ?$ R+ G
printf("\40:%d!=%d\n",i,fact(i));
1 v2 {1 E1 g9 o}
' L) \! m/ I% Kint fact(j)
1 S. o u$ l {: u8 }# Cint j;
- R# ?. }# _& u9 r( e{
. h2 n% C5 X! X! Gint sum;) i+ O0 x0 n4 K: H
if(j==0)% ]) @& ?$ @# z) L' {6 B: n
sum=1;1 n6 V Q7 Y: \
else
. }2 p0 E! h3 _& f( Z sum=j*fact(j-1);: J7 F( s5 q, N
return sum;
5 a" F% U6 t5 T4 A1 ]& y}
$ O0 [) k- F: V) n4 f==============================================================
" j3 C# e$ Q: r' R& s% y$ c5 V* Y/ w |