EDA365电子工程师网
标题: C语言经典算法16-26 [打印本页]
作者: dilidili 时间: 2017-10-6 14:43
标题: C语言经典算法16-26
【程序16】 6 {8 S, V# }9 G( G7 s! M+ K9 F/ H @& z
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 5 z: t8 z1 D5 Z6 N
7 ^6 W F- _7 g# i. u7 i% A; y: W
4 Z, C4 y0 O) j" S8 ]) [/ p
: p* J4 v2 S6 P" p
作者: zhlei81 2005-1-22 11:30 回复此发言
% F3 }" n, U' b y" W
2 r# z0 S5 Z3 @: h$ O# Q7 ?--------------------------------------------------------------------------------
1 k6 K4 r! B+ e- q" T! J3 j) `" Y0 Q* Z* z8 M
4 回复:经典C源程序100例
+ g V' V- K, _6 K1 U1.程序分析:利用辗除法。 , z. Q9 K3 S5 `" p
# W) M7 C% c; G! V2 K3 N' m
2.程序源代码: " {9 t" L8 u3 ?& @# ~5 N! M
main()
) H3 D: e# H0 Z{ 3 d. S! u- U' Y2 ]$ {) ~5 R# X
int a,b,num1,num2,temp; $ l$ t/ J+ ^7 X5 K/ B I7 U
printf("please input two numbers:\n");
+ B x8 K7 D T5 J. L6 ~0 y4 wscanf("%d,%d",&num1,&num2); 7 ]2 Q' q; G. i; w5 y/ Z/ o/ O* {
if(num1 { temp=num1; 9 a( \# R) G% ]; l
num1=num2;
3 o5 B Z/ ]1 \1 R" {num2=temp;
0 ~) {; x; |! N$ z6 y/ m} 3 B; _7 j& h) b9 `, C
a=num1;b=num2; H. f; T1 b M0 B
while(b!=0)/*利用辗除法,直到b为0为止*/ ' ]+ I" x3 K4 Z+ r
{
6 F& `* O/ R% ~9 u' T& B2 G3 f+ itemp=a%b; 3 c0 u( Z0 b. e: r; H
a=b;
2 H N7 s1 i9 B& E9 R ?+ ob=temp;
0 u; ?% Q! Q( A8 K}
7 L, A4 D1 u, t5 _3 Sprintf("gongyueshu:%d\n",a);
5 o4 T8 B m. ]9 fprintf("gongbeishu:%d\n",num1*num2/a);
& i1 h8 Q a. J2 m}
4 a- d& ~& t! y& Q( a' k==============================================================
7 Y$ R6 s" X6 u【程序17】
% ?! k" H' q( n0 b0 `题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
4 w) w+ b! V7 B9 [1.程序分析:利用while语句,条件为输入的字符不为'\n'. ! o+ |5 i/ z- c$ @; {3 f8 D
; d8 t$ Z+ w, g; F. U& h2.程序源代码:
: I/ ~$ c' I8 y4 P: N! r: H' D1 d#include "stdio.h" ; {( i( S3 a$ X- o, y5 I; A
main()
1 l0 P# O* W/ O+ S `{char c; ' d% X/ [+ f) m
int letters=0,space=0,digit=0,others=0;
. C) C6 P/ Z* V) e( aprintf("please input some characters\n"); 9 D+ w( g" V+ k( }2 T+ e
while((c=getchar())!='\n')
5 i+ t$ J: i2 S3 _{
4 W5 Z* L9 A8 f8 xif(c>='a'&&c<='z'||c>='A'&&c<='Z')
' K9 P+ [8 m- P0 ^letters++; 4 S, y" z, F/ [ z1 o
else if(c==' ')
1 s7 ~: r5 C7 l) c& [space++;
1 ^1 M) M) ?8 l; @9 b9 S4 E3 W# p) Selse if(c>='0'&&c<='9') ' O1 I* f6 _7 z
digit++; 1 z) ]* s1 M' t5 l3 V7 S( l
else - w; W5 r( x- S* u+ \% p
others++;
5 V7 l- d# j, f! A ?: P! H: p1 |}
* c) M! p& o: T1 m. y7 ~" X. Bprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
( m& I! t8 x5 Q! L6 o& pspace,digit,others); & ~7 R9 S8 I* v
}
. ~, q1 ?8 a& M8 Q4 D============================================================== & M, I6 U1 F8 s( ^- o+ A
【程序18】
+ V$ B+ c; R t" `$ J; K题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 ! I) u E! ]! |0 E: ~5 p6 X3 O6 F
共有5个数相加),几个数相加有键盘控制。
7 V! B, s2 ]4 Z9 j+ l1.程序分析:关键是计算出每一项的值。
- b$ M) f8 p {8 U2.程序源代码:
8 v7 Y4 c* t9 Q7 Dmain() & ]# `8 R& {- E; `9 b3 w
{
1 c/ e e$ C y6 t$ p) l2 x3 Zint a,n,count=1; % o! y/ Q3 w" | W9 X3 H
long int sn=0,tn=0; / K$ b* r; y, @8 [) S
printf("please input a and n\n"); ! P5 u7 z3 y3 d6 e% e
scanf("%d,%d",&a,&n); % T2 r0 ^5 \$ h/ ^9 }7 N
printf("a=%d,n=%d\n",a,n);
6 ?, F8 \5 J) X4 v0 G, kwhile(count<=n) 8 y0 D( ~7 p6 m" l3 n
{ ' e+ [: _# q5 |
tn=tn+a; W2 `. _2 m- O. O
sn=sn+tn; + `! I- I$ B; y4 R/ S3 G# ^, z
a=a*10;
1 a! g) u7 E# d4 n, J/ Y++count; ' F! \( I N& }
}
+ {3 e. [! J7 K* jprintf("a+aa+...=%ld\n",sn); ( H$ @( b+ H% D( e. k
}
; T4 D2 c% N, E- s==============================================================
5 D+ g4 f; X5 Z$ ]9 b; N" Z【程序19】 8 N0 P/ O7 f% Q! K4 V2 d5 u+ R& z0 ^3 S
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 . K) f n$ k! @: _6 w
找出1000以内的所有完数。
& A. P3 y- Z% B/ ]* F& H1 e1. 程序分析:请参照程序<--上页程序14.
- c3 a+ w9 G) T. B2.程序源代码:
$ ]- E B5 @( e6 Ymain()
7 t# J6 V& X) b{ 2 ]( u) i( k- h5 ]9 ~. |
static int k[10]; % q! V: e. x) C/ ^! }
int i,j,n,s; . k! c1 M0 l+ l; {
for(j=2;j<1000;j++)
0 R6 f) e+ {5 i# L( L{ ' J" a$ L+ g8 B' z2 N! c
n=-1; 0 C, t' g5 P& k& x( @
s=j; 2 e% e* }8 I. D2 _6 y3 [ F. T; s+ }. g
for(i=1;i {
4 `3 d/ H/ R3 Uif((j%i)==0)
) N( e; A( T R! v0 M' x: u{ n++; $ }# j5 K5 A }6 f: T O
s=s-i; , K9 N% A2 ~, H
k[n]=i;
, n! |. P: \) Z) O( w}
+ H& S j5 l/ D4 K$ P} 5 {: |! M1 z& e" |
if(s==0)
$ o( e6 x, g# ?- D{ ( Q+ X8 |7 H( c' M9 P0 o; M; D
printf("%d is a wanshu",j); 9 U5 h: x! x; i% y3 P+ Z/ l/ l1 Y
for(i=0;i printf("%d,",k); $ \/ h1 z9 V" I K
printf("%d\n",k[n]); , S$ ]8 ^$ _. r3 z
} ! `' b% r# s! n
} 5 g U3 E" C6 M" N$ C
} ) [! Y2 z0 E. H' ^, @
============================================================== 1 ^, B6 \. X- p8 j! M
【程序20】
! n+ P5 p0 B0 |4 H. Q题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
! x; \) N2 p7 ^: h" C+ _第10次落地时,共经过多少米?第10次反弹多高? 4 g4 i9 t( a* s5 y+ w6 \2 U: E0 i- U
1.程序分析:见下面注释
A' [$ P4 d9 m: k$ ?5 c2.程序源代码: * W7 P0 B+ y" P4 v
main()
- T4 F! i/ Z1 g: }$ T X- m{ " b. {5 L5 d/ @& u* c6 x
float sn=100.0,hn=sn/2; : X! F) G; p3 L3 a4 O2 F& P0 {
int n;
y3 B$ b- p: a' y$ Wfor(n=2;n<=10;n++)
+ d! D5 f1 V6 Q8 j, M# ?/ l{
# b2 ]( s5 L, h, S; {sn=sn+2*hn;/*第n次落地时共经过的米数*/ ; i }+ E9 B3 P: P! C' R
hn=hn/2; /*第n次反跳高度*/
8 K( b2 c2 L8 _6 f( A) ~} & |7 M; }( B/ Z0 i C0 b. Y
printf("the total of road is %f\n",sn); X; H/ i! D8 k# f) H y$ U3 L2 z
printf("the tenth is %f meter\n",hn); + G" a5 F2 M/ L! _ Y
}
【程序21】
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
9 t) I" V) g4 P% Y0 k 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下0 Z' d% w2 b( x+ M
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。& Y1 h) M }) s! r2 R) v
1.程序分析:采取逆向思维的方法,从后往前推断。; d9 u# Q, {4 q' F
2.程序源代码:
+ D4 L: T+ t0 p& z* Q. Bmain()
4 {4 K3 k. _7 T# D) t- Z{
5 ?2 N5 y7 N/ r5 k, v, ?- wint day,x1,x2;
" n$ n8 Y& l2 P. R- O7 l( k9 xday=9;
' x2 [) f/ X8 B& n' H7 W- B, a: v1 }x2=1;
7 O# ?4 C! R) i, X) Awhile(day>0)
- q4 ]6 E$ w- Y0 S6 Y {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
4 Y! e) w# j* h# A b c x2=x1;5 T4 k) ]( t; S
day--;1 U2 ?( ~0 y6 O- J
}
3 | x2 g# _6 Wprintf("the total is %d\n",x1);1 }/ M5 M( s5 e9 x
}7 w$ {: V$ A& W" K$ P
==============================================================
- L: v: f& n! g7 J: Z O【程序22】
; ?# V0 `" y, _4 J. R4 E7 U- S# b题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
0 v; C! C. u8 y8 t1 H 比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
5 {) Y+ K2 L/ u* c, K( o0 c 三队赛手的名单。
- k$ ?3 o0 H }# u4 q- `1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
) ?" C% ?3 `& D 则表明此数不是素数,反之是素数。
7 t G5 n* K. K2.程序源代码:0 p6 S: d# K! g" h5 q; Z+ |
main()/ Z% J6 w& _* @ k( `
{' x4 X. i' m6 ~- y3 @ y. d C* j; b
char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/
" P! O0 Z% d& I7 pfor(i='x';i<='z';i++)
* D# a S! X/ }6 s for(j='x';j<='z';j++)
5 p# ?! @' t- [( l! c# N {+ [% w5 f/ S4 l, g! F/ g% v
if(i!=j)5 z+ O& B4 H" b# P
for(k='x';k<='z';k++)
. x3 z Y- K. M$ S { if(i!=k&&j!=k)
- x5 F4 n2 a. {: A- y/ f { if(i!='x'&&k!='x'&&k!='z')
( ?# `" F& | l$ [. Q( l printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
, ]9 z8 \& A$ ~% S# o( { D" E }' a6 [1 e5 e* V. X
}0 ^) y t# y+ L8 V" i/ Q
}
0 ^) i J, U' `: ~1 B7 ~, p I}
* {' }% V3 r* } L% I) u==============================================================
2 _$ ~: m" y" v! G1 i8 Z【程序23】 ! _. j6 w$ Q1 J& E+ `
题目:打印出如下图案(菱形)
*4 B3 S- D/ y; F8 G- C; u
***
* R8 T6 _" ]0 A******
5 e& ^4 L% Q$ Y* m********- E Q* N' Y3 Z- k4 R0 A
******9 f' f/ K& U3 R- i/ Z
***/ M# [* x* t8 {
*
/ H) D& V, @7 \9 J1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重8 @8 u' a4 t4 g- N: [0 O
for循环,第一层控制行,第二层控制列。 ) W" E# i3 N' {1 X4 Q# c% n
2.程序源代码:
/ |% [: Z/ Q! \8 S: \' U# vmain()/ ~4 k5 O, {. [; V) j) W1 _& X4 D
{6 ` v: G/ ^# ?8 b; `$ a
int i,j,k;
% y. y, t ^' {* F* f/ ^for(i=0;i<=3;i++)
+ ^; c6 n6 m1 h( M3 b {' [/ V: `4 V* u1 }5 p8 E
for(j=0;j<=2-i;j++)7 P" K. Q& \. S/ \, K
printf(" ");3 f' y' }( M( t0 Q, j* T& b
for(k=0;k<=2*i;k++)/ x$ t1 }$ u$ b! D
printf("*");( q! s. D: S, C. z" |
printf("\n");
* t9 B, U2 y& I1 H }
7 T, w. }: V G2 @2 K; c0 J' N2 ifor(i=0;i<=2;i++)+ N; _% Q/ u; i( s1 g
{9 X3 J5 z3 t @
for(j=0;j<=i;j++)
. ]+ e6 f. Q7 [. m* M printf(" ");
# k% X6 i% k1 A6 {! R; h+ B for(k=0;k<=4-2*i;k++)
/ }' m% ~8 S" F, f8 j. \- a# b# i! a( Z printf("*");9 Z( b' D' n% F5 j+ j
printf("\n");
! `+ }: f1 t3 t8 U$ @ }
2 L. L' o: b. S/ E}
; Z0 k% k! l' Q Q+ Z! h==============================================================
& S/ F, m% H' b) b6 V! l$ E【程序24】 + T( @( \; b9 w& X
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。1 A- c" C# n M0 c/ A$ q/ U8 H
1.程序分析:请抓住分子与分母的变化规律。 0 e& X# w% J, `
2.程序源代码:/ a( G" v4 ], p
main()
6 r. |" O8 a& t1 J, D' [6 `- v; W{
; y$ [" G: s5 B- t! `int n,t,number=20;4 g% ]3 P+ X2 c& C4 Y# ^$ y3 l/ y
float a=2,b=1,s=0;
- C3 ^" h& M& xfor(n=1;n<=number;n++)7 G, c! X8 @" X; o
{
1 t8 K4 ^' _% ~7 z0 c/ b s=s+a/b;
2 ^6 v/ M6 | b& m% D2 t t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
. p- Q8 S' L" S: R! y7 k z }
4 K5 u% q8 V% Eprintf("sum is %9.6f\n",s);
$ r8 Y/ j: H3 Q/ j% U}
% p7 K. }* y5 [( g4 l3 i==============================================================
" q; b8 k; Z# K( q$ c" B- Z【程序25】 嵌入式学习企鹅要妖气呜呜吧久零就要
/ a4 P1 _0 R! R& J$ O题目:求1+2!+3!+...+20!的和2 } K, \$ i6 ^. u4 r/ k9 b D- _5 k
1.程序分析:此程序只是把累加变成了累乘。 + x$ D- A+ X9 V: c1 J) I
2.程序源代码:
6 [. \ q j8 u3 X% Ymain() F1 z0 R4 p% g
{
4 h9 c' x! z# S r8 o" E* yfloat n,s=0,t=1;
- }" c; @6 S* r" A5 J! ofor(n=1;n<=20;n++)" m' ?7 {1 @4 K0 q) F
{
4 ?: u+ z) r# W t*=n;
, T& {' E9 E/ ? s+=t;
' [2 K8 C8 ]% I6 A }
, V% Z9 A2 p9 Y0 j: q+ ^& Bprintf("1+2!+3!...+20!=%e\n",s);
7 C% P+ H& u& ^$ F8 J}
5 V$ ]5 ?* h; \' x& u$ Q==============================================================
6 k4 ~, l. l2 \/ j# S0 A7 z) ]9 d【程序26】
( }, E. y& Y% f# V, E题目:利用递归方法求5!。8 y% j( q: F9 u* j
1.程序分析:递归公式:fn=fn_1*4!- y# j) d& L3 G' d% T% Q- _2 W
2.程序源代码:
0 G( S q( |/ C#include "stdio.h"' @7 U1 R( n5 K
main()
$ V' R3 k. d% R- A/ V{4 g# i Q0 G8 o% G. q
int i;. V& x) l# s. j' [$ |0 L
int fact();8 I4 U4 j6 l, @5 x
for(i=0;i<5;i++)2 H! {5 I$ \ e$ n; s
printf("\40:%d!=%d\n",i,fact(i));4 Q7 k; x5 G3 r! Z
}2 t# A0 E) I# W
int fact(j)
4 |) S1 a, k( B. eint j;- @) @" K' a* `" P
{
9 e. v+ W! D0 z) nint sum;
6 g) a4 A. u9 _$ k' B2 E3 Xif(j==0)' j& [7 U1 D% ^ X
sum=1;
) s) y7 x7 I( ^' w2 P! pelse# h2 Z! R' T; ?: ]9 k
sum=j*fact(j-1);' V/ D V' j9 H1 }, Y; m4 o
return sum;
! B3 I& f+ C' H( v+ l! P- {$ P}
, |- }, t! `& I( U& V8 L==============================================================
& s* _1 z# ~: } D( T' c& ]8 ^
欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/) |
Powered by Discuz! X3.2 |