EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
【程序16】
p; E4 @0 f9 `+ S; u题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
* Q: R2 I* m- I) X& W1 B! `& B e4 A/ J$ A+ k4 y9 ~
0 {; S4 p7 x& S6 c; J% V& T' D- K' s/ Q+ q) d/ n% J
作者: zhlei81 2005-1-22 11:30 回复此发言
% _' q( t2 c- _ J, O+ V5 M$ H% Q; ?' ~
--------------------------------------------------------------------------------
4 M* ~+ G8 I R) v6 p; o) V- k# y q" g+ W8 v0 M( G
4 回复:经典C源程序100例
X5 V# o' j7 \3 N8 K% {) ^1.程序分析:利用辗除法。 ! [ ?! a) i, }+ @' e, ?. q
' |4 e6 N2 _( `" D8 w
2.程序源代码: ' y R+ ^7 i& x: @. v8 P$ ^- p& _
main()
/ U3 X1 L2 r; i4 d8 V4 j{ 0 D) g" A: V" p7 t# z* X- q1 H4 w- `
int a,b,num1,num2,temp;
* K0 c/ l/ f$ r4 d% g8 J" C9 oprintf("please input two numbers:\n");
, q, }3 E! q) u1 Y" g" ^$ @scanf("%d,%d",&num1,&num2); " `8 ]% E+ K4 a
if(num1 { temp=num1; ; N1 _$ T4 [. w6 c( ~- o5 w& a
num1=num2;
) b) a7 @5 o, e8 _+ dnum2=temp;
* S7 j9 Q: f4 H' H& ^, o6 M} [0 O3 ]4 `2 @0 O4 U; e9 l/ y
a=num1;b=num2;
n+ E s" ]7 S, U. Twhile(b!=0)/*利用辗除法,直到b为0为止*/
0 b$ w. r$ w- a) o{
0 \1 y+ x+ \: W* ptemp=a%b;
. v' c; [% l$ ra=b; 0 H& {2 w8 I+ H
b=temp;
8 b1 B" A- z- ]5 t l} ; X7 ~; p; C7 t f
printf("gongyueshu:%d\n",a); ) t* v7 S& B* a; d4 S) k# u; h
printf("gongbeishu:%d\n",num1*num2/a); n. |" q$ r8 Z# Z2 [: O+ M I
}
" w- ]# N+ Z; w+ }, h* c: A+ `( J M============================================================== 2 w* q5 @" }6 b6 s
【程序17】
* b3 a: `3 v; I题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
8 }4 z; C2 H. r. e4 @- ~. x1.程序分析:利用while语句,条件为输入的字符不为'\n'.
% m$ }: C4 W7 y, E
3 Q) P$ U! U( F8 m: s! c3 ?, u2 I h2.程序源代码: ; Q5 u( C& V5 m! Q8 I' _
#include "stdio.h"
g) V* C7 I, M% bmain()
$ O3 k4 D2 U* `" }+ N1 h4 z z{char c; . b7 v c1 r0 s6 o/ c2 n5 g" D
int letters=0,space=0,digit=0,others=0;
* f, T/ J. [4 r' u3 h5 f1 Rprintf("please input some characters\n");
b7 O& e3 f. G: x7 Q9 ewhile((c=getchar())!='\n')
9 a& T/ n" e2 c' \7 y{ 1 V2 T/ j' U+ q3 m" |9 K) d2 ?
if(c>='a'&&c<='z'||c>='A'&&c<='Z') N6 f+ W7 `0 `
letters++;
' t, ~! H" z) t7 ^0 Z2 C0 v- }else if(c==' ') + C) o7 k" o6 u4 O* Y$ r
space++;
; H. w) G9 k5 J( lelse if(c>='0'&&c<='9') ! C9 d) }4 ? E
digit++; 2 m; D" ~, L* A6 ?- v) }
else ) F$ w& T1 K% p! |7 l6 q) e: [
others++; , y( `6 t+ e8 R$ l( ]) v" ?
} , s8 p+ L2 }+ `7 r- F6 l# R7 a
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
) D& a8 K0 Y2 U r! @space,digit,others);
+ W+ o+ _! l, ^3 T$ p} ; P9 W0 V/ M7 G/ X+ h
============================================================== : T& m# J4 y& o- D x
【程序18】 . T! l) ~6 n. \
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
7 w% F, ?9 C1 B0 J- @2 P共有5个数相加),几个数相加有键盘控制。
5 l8 O: P, y0 c! g1 e8 A1.程序分析:关键是计算出每一项的值。
2 P/ W* I; \) p/ U! m4 D# y) K2 p2.程序源代码: ( _5 q6 V# ?, t0 H
main()
7 H( G5 {; M9 B% d% q" m{ * A9 }& `( x+ e% ? ]$ p/ V, x& O
int a,n,count=1;
/ _2 I' W; i- }) k+ ulong int sn=0,tn=0;
1 A: w$ i; \" n' \+ n: O! Fprintf("please input a and n\n");
5 M6 i' P X/ v$ h! J) G u$ }scanf("%d,%d",&a,&n);
! \4 G( h4 f1 P6 Wprintf("a=%d,n=%d\n",a,n);
* w4 K# O9 w4 p0 a; s, Fwhile(count<=n)
4 V$ u5 {$ @2 Y' a% {{ 3 J8 U/ k2 C* b2 y1 [5 b3 S. ^
tn=tn+a;
: x& D2 `% ^; C1 R, I6 }sn=sn+tn;
8 t1 L9 _% L, h1 i4 y- C% wa=a*10;
3 E0 A" ]1 `6 D! l& ^( a) a, \ i++count;
$ S; b7 h* M5 ?& F; S3 Y} 8 @) u8 p! ?9 ~' g
printf("a+aa+...=%ld\n",sn); . Z! N" W! H' {/ u/ S2 X
}
0 n3 p* i a& V4 O============================================================== 4 x3 m8 ^/ w. w& u2 F) @- }/ m0 M
【程序19】 6 n4 p5 K$ O/ p" c
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
( N: x% D$ ~* j# ^" S' `找出1000以内的所有完数。 ; S. I% A! r- p* @- W+ r# Y% r! K/ I
1. 程序分析:请参照程序<--上页程序14.
2 Y9 V6 `# Y5 Z B4 b2.程序源代码:
' k1 K& w* x- G) }/ l3 }" U% ~main() 0 f5 o6 P K# h8 y9 r1 z
{
; d# E, r5 Q3 U) Z6 [( ?+ e, \static int k[10]; 2 h3 w# }; ?4 q6 B
int i,j,n,s; $ s# b: X/ z5 K
for(j=2;j<1000;j++) 1 L. g3 k8 X- Z1 {5 m4 K( h
{ ; d d8 }3 k! C& p
n=-1; ' {2 S- [5 b3 T2 L1 q
s=j; 4 k0 q5 `) X n4 t
for(i=1;i { 0 F: A9 m$ g: c4 K
if((j%i)==0) ( ~3 l6 U0 U l' Z
{ n++;
& K' Y2 w. F% m3 J0 N$ rs=s-i; * h# B# n) h- u8 H9 r
k[n]=i;
' E: O/ J" r! I3 h4 q& a4 P2 e}
% |/ a3 T/ Z5 Q U+ r6 T' e} 6 ~9 }' M0 x6 ~0 x
if(s==0)
: R, v2 f/ j* ~4 j# G x{
+ y2 i2 \ @7 a' P( Vprintf("%d is a wanshu",j); - c/ B9 @' O0 o/ U
for(i=0;i printf("%d,",k); % h% I, p) h/ C5 [! g2 k) J. v: |
printf("%d\n",k[n]); # [+ I6 o- i% `% m
}
% ]1 H6 ?, e) L5 D* j) D4 a$ T8 G} 1 W) ?1 U/ x/ H+ N! u
}
; d0 s3 M' J; l" `/ W==============================================================
1 n) {& P0 Y G' z* B2 `& L% p7 W【程序20】 $ W/ W" S& z2 S& [8 _
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
2 q, Y2 I6 ]$ j7 m7 S第10次落地时,共经过多少米?第10次反弹多高?
7 s3 q1 \ ^" `2 H8 Z1.程序分析:见下面注释 / m2 z' t$ H* |8 `) t& W! ?
2.程序源代码: 5 o( l; \! g# g3 w" S( i6 ] f
main()
" Z |5 M) W! A{
0 f1 ~- _1 D. E( R; f8 O0 Efloat sn=100.0,hn=sn/2;
% M% Q+ \5 Z0 e+ P; Z* lint n; ; ]" E! Z7 }& ?
for(n=2;n<=10;n++) ) y6 ?1 @8 G) j
{ 2 s& n T: c" D! P0 A; v3 u! `/ c
sn=sn+2*hn;/*第n次落地时共经过的米数*/
8 X! i5 K8 O, ^, thn=hn/2; /*第n次反跳高度*/
( i/ O( Z% L- e; O}
7 Z5 @* L$ s$ L |6 ~printf("the total of road is %f\n",sn);
! ]6 p0 T5 H! v: B3 |" lprintf("the tenth is %f meter\n",hn); 0 {! a: p( H$ `& \0 w
} 【程序21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
/ |+ C& F; w3 l! n 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
# s! M- ^( T4 R% G4 P2 x- O 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
8 _" U0 d, F, a% v P0 A( y* C" @; Y1.程序分析:采取逆向思维的方法,从后往前推断。& v+ C6 [" a# I! S9 @4 F( e* g
2.程序源代码:: C- D7 b' D7 @5 B6 Z0 X
main()1 H4 s" V/ @* {4 r \
{
. k! X1 x+ t, ~8 iint day,x1,x2;
- `! `. ]: x+ F- Xday=9;
4 d% ?! `& }7 C: Y: ?1 _x2=1;' _) e3 V; H, f* J- I+ \( \
while(day>0)) X" e/ S: y% t9 R! w1 G
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
Z b7 F2 T. r: A( Y/ [! s3 m6 w2 p( M# f x2=x1;+ q& p% }* I& l1 M; @3 `; q l
day--;% D: x+ C* X! |
}
|- S# _- \0 Uprintf("the total is %d\n",x1);, i% X* }) X& S' c3 [: ?* H
}
. V. s, z9 ]' x1 Q==============================================================
% a9 W) X1 K5 Q9 x. C+ U【程序22】* ~5 R; x& ?4 F& H
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定' D+ \0 l8 Y2 @7 h* V
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
2 E; v" e2 T" a* `7 T- @" c! ^ 三队赛手的名单。
4 `) d3 k5 T+ F3 B4 p- ]9 }+ h9 o1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
& _* u) t G: W& f 则表明此数不是素数,反之是素数。 ( b. l1 }* B% t, X
2.程序源代码:5 d0 x: w* y$ p$ C1 f
main()! }7 c7 X4 o' }, z" }
{
5 P8 E) m5 J8 y% X1 ~8 W8 p2 ?, rchar i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/0 n* L) X1 r- Y
for(i='x';i<='z';i++)0 a0 [( ~3 }% _$ U0 B k8 }
for(j='x';j<='z';j++)
5 H+ E9 s, v& D {- U0 k0 N, v2 t3 I3 y
if(i!=j)3 r# |( F9 J0 n4 s" `
for(k='x';k<='z';k++)
& v5 V/ `) W- t% x: g { if(i!=k&&j!=k)
. l0 r1 v( H4 X! G4 D& z { if(i!='x'&&k!='x'&&k!='z')4 q+ A% Q/ o4 ]
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
( ]) i2 \7 e B o }
5 d. [- m7 i; _. i3 S3 h( O) }0 [8 i }
% N0 h4 q0 p; K. D* p2 s }0 f% [3 ?* q( {
}* S" b: @) z1 U5 J2 e* `
==============================================================
& k- S; [6 c( e" r【程序23】 " F7 t! X" M: L9 a
题目:打印出如下图案(菱形) *
: r0 h( ~) p- y$ }' k; g***
8 D4 |; J8 ~ \4 n% I******
. |$ Y! E' D. E% {******** 5 Z2 O9 P5 c" A
****** : t. m$ s; Z9 z/ p. j! W
***
% `: \5 s# T$ Z7 t7 c* 2 T d9 \6 _+ p' l) g
1. 程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
1 o) f+ w! n& d& f# O* r for 循环,第一层控制行,第二层控制列。
- v4 ~# a5 d& G3 x. f2. 程序源代码:7 m- h3 W2 l$ g( v
main()
! x. y) o0 V% U0 F) v{ . F$ \7 Z7 b2 t( I" {( x
int i,j,k;
- t0 Y& _, r- G% g0 v$ C+ G3 k% K! yfor(i=0;i<=3;i++) ; S% o- A2 _) _) {, N' H1 J
{
4 w5 N% z. Y% h+ d4 q, ? for(j=0;j<=2-i;j++)
5 `3 _% l V4 y printf(" "); 5 U$ B# `( d- O0 s0 [: x4 E* ?
for(k=0;k<=2*i;k++)
+ y' g* i( }& h# h% b. S/ L6 E printf("*");
) k" D$ B$ G% K3 \$ [ printf("\n");
/ W3 ?( Y2 e3 _5 L }
, ?, q+ B; O( }/ t6 e3 ]+ Hfor(i=0;i<=2;i++)
# M6 B: \1 A1 `& c {
) d$ s4 A, i3 @6 t for(j=0;j<=i;j++)
% }- x: \2 @6 t# \) V printf(" ");
4 `1 ]. ^8 }9 Z1 Q for(k=0;k<=4-2*i;k++) 2 L# ]& Z- F. _8 {6 d0 p
printf("*");
$ s b6 z) P6 O. d1 D# g printf("\n");
# l3 ]% {1 s8 i } : U ?7 L' w3 n' n
} " }. @8 u/ ]$ \8 Y
==============================================================
i& {. `& H. o1 ^8 M) I' E【程序24 】
& F: m6 I3 V8 E题目:有一分数序列:2/1 ,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。* b- ?- d- j6 U# Y7 I/ P
1. 程序分析:请抓住分子与分母的变化规律。
8 f7 y5 ?( _3 g. }! B$ R6 J2. 程序源代码:
% a& @, m' Z# t0 N3 I5 O; ?: `main()
9 Q) c1 q$ y( ^" A: Y{
2 l r4 [, x3 Bint n,t,number=20; 5 h$ J( B: n! `, d3 n
float a=2,b=1,s=0;
" k# b: L! r6 P. Q# M! k1 I1 s9 hfor(n=1;n<=number;n++) 1 ~) d" G+ N6 G, C$ q
{
( `; p( R5 t% z s=s+a/b;
& i+ \, c& l# V& y t=a;a=a+b;b=t;/* 这部分是程序的关键,请读者猜猜t的作用*/
) w) {2 k# c% G$ Z7 J$ @) Z }
+ ]* |! ~: p; P4 U' x9 O3 Iprintf("sum is %9.6f\n",s); 6 X7 i5 C* m" ]2 w/ l' V* p
}
5 f! J+ D9 n/ A============================================================== ; @) m5 W# x6 U% z: e
【程序25 】 嵌入式学习企鹅要妖气呜呜吧久零就要
5 s$ A6 K$ N2 K- O题目:求1+2!+3!+...+20! 的和+ c9 p i+ Q- u A$ V& z
1. 程序分析:此程序只是把累加变成了累乘。 ' w7 l5 z4 s# m
2. 程序源代码:* T- p, O9 |1 z! W3 R, W
main()
5 ^: u2 ~+ o2 c$ c* N& L8 T% K1 y" [8 p& L{
4 o0 n! _, T; M' Efloat n,s=0,t=1;
# w& a, y; H) J! ?# mfor(n=1;n<=20;n++)
, b/ `+ n8 H6 B% E' c* ^" a$ X& N {
2 t8 |; x, z2 Y5 T$ D! f. B8 S* b t*=n; 7 W. r# v+ P6 F, ]2 J
s+=t; 5 k# o u* M. F2 G( z' p$ j; X
} 1 z+ j$ z( y) o. i3 X3 D
printf("1+2!+3!...+20!=%e\n",s);
4 E( x! \8 S( l8 v- u1 ]- h9 n6 d& F}
9 s) J: n7 A3 E# {+ X0 x: @6 K' n==============================================================
( V$ W" A: q: k1 O【程序26 】
5 W! y, l; V5 A题目:利用递归方法求5! 。* }0 X' q, `7 o- A, j3 e1 ]
1. 程序分析:递归公式:fn=fn_1*4!
/ A! r5 [; r1 Q2. 程序源代码: T! F8 j M: d1 f- n8 w
#include "stdio.h"
9 N. q' Z# V: Cmain() ! b0 r- K5 v( w I" R
{
2 y7 T8 E1 T3 Q/ I& Qint i;
2 X6 v9 Z, _3 J- H/ wint fact();
- q2 K7 e9 T" x- |/ g2 yfor(i=0;i<5;i++)
/ s" Q+ J$ H# `; E! C% s% s printf("\40:%d!=%d\n",i,fact(i));
& _8 J( J }3 s/ b' |}
2 F5 d3 ^" f) m% z: L$ P2 Fint fact(j)
5 {4 u! \" L. d+ [( c. f& c+ \int j;
9 E) W) }2 }% _) q# l0 k) i7 u: g3 F{
/ Q/ G! G6 n2 E0 xint sum; 4 c: U7 Y9 g7 S% z& o; }
if(j==0) + ]. r" u. M; Q' c, M8 L0 {
sum=1;
* H$ u) L O+ w; | Z0 y' Jelse - }, O+ O% S: o
sum=j*fact(j-1); & }; q$ v/ u7 y8 C/ i0 y/ \$ e* x
return sum; % j ?$ Z" |; M/ \
}
' S" {) q# m: D! B: D============================================================== 4 Q' k1 o6 z( K+ u# f
|