EDA365电子论坛网

标题: C语言经典算法16-26 [打印本页]

作者: dilidili    时间: 2017-10-6 14:43
标题: C语言经典算法16-26
【程序16
0 B$ {& v& R* O9 k* m0 B8 N题目:输入两个正整数mn,求其最大公约数和最小公倍数。 6 }% U6 s* i3 ^' o1 V/ E' l
# V- |2 K! C% r0 H' e# V
7 U7 H9 V% |+ L

: X# _9 b2 i6 D. ?作者: zhlei81 2005-1-22 11:30 回复此发言 " [) E. o* A6 j3 l# Z* k' K' z
! p! U+ ?# Q8 G- b
--------------------------------------------------------------------------------
# a' G4 ]' W: m* R- a' S2 j+ {) |$ q, Y7 |" k5 ?% j
4 回复:经典C源程序100
) C. h$ Z" H9 J: o: n% R2 H  Y1.程序分析:利用辗除法。 6 @0 l& e+ M6 [2 l& p% U) ?0 y$ W4 s% N

4 \1 p% c* a# F* O0 N' ]2.程序源代码: * v. A! v$ W. M3 H6 f* }/ p
main() : r5 @7 ?! [0 a' M
{
( }+ X- x5 W& P2 ?6 ~$ G, m4 qint a,b,num1,num2,temp;
) X4 g2 c; m0 ?! h9 A+ @6 ]' Eprintf("please input two numbers:\n"); 4 t0 B3 |! V! J. t" Z, q
scanf("%d,%d",&num1,&num2); - w6 ^9 U8 G' g+ W. [
if(num1 { temp=num1; , e1 p; p  n& _  ?
num1=num2; 8 C& q" m5 ^6 Q/ q, L
num2=temp; : f' U# z/ J) M  P1 ]
} ! I; |% m9 @6 [" _% m; d8 O) n; y' C) G
a=num1;b=num2;
1 u! \" t; C/ G: _* `; q  c8 O/ qwhile(b!=0)/*利用辗除法,直到b0为止*/ + K, n; \# K: Z9 y- ?! w+ C+ t
{
$ Z* z3 A6 j8 E' Ftemp=a%b;
$ P3 a+ F; G! P8 La=b;
9 R0 U  C1 B) r- y7 e2 ~6 W4 o1 ]( ob=temp;
% I2 {% j! i, B1 `4 _} 3 V4 g, s  l/ ]6 E
printf("gongyueshu:%d\n",a);
) {/ o! \) W* U8 d' y% m7 iprintf("gongbeishu:%d\n",num1*num2/a); ) |; f: b0 m! v' Z6 J
}
( C8 W  G0 d: C5 B============================================================== # O. z3 \' \) B7 e  W$ ]* {
【程序17! x& l! q# i/ s* S) P
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 0 C9 T- \1 P# ?7 @/ O9 M$ @
1.程序分析:利用while语句,条件为输入的字符不为'\n'. $ E: }0 }! ]' Q) ]2 H0 U

$ s; a7 ^9 N1 _7 g4 R3 \$ W2.程序源代码: 8 U/ y& N) m" u4 i+ R
#include "stdio.h"
7 ]: K  P9 f( V8 k) D: {main()
. r0 C+ S" s9 k/ h{char c;
4 P0 W! y$ l& r9 c7 n/ @3 `int letters=0,space=0,digit=0,others=0; + g) ^; p2 W! _
printf("please input some characters\n");
& u5 N- l! T2 c/ _& |  V# mwhile((c=getchar())!='\n') 5 e. L% ?5 \' s6 u. p
{ , G% x5 N9 m% R5 T2 m0 c1 s
if(c>='a'&&c<='z'||c>='A'&&c<='Z') # p* _; z7 B- l* }4 ?- P" U
letters++;
( F9 ~: ^% b5 ?$ H* G) j1 n4 @* Welse if(c==' ')
( T+ l/ R3 o7 P3 J* pspace++;
2 R8 ^& r3 A. Y# A1 l; ?else if(c>='0'&&c<='9') 3 F3 b  a4 c. U9 d) ^% r
digit++;
" q8 Z1 ?9 v  X; L  R. x$ Oelse 7 D; [# P- {6 M+ T8 u3 ^
others++; ; l$ }- q+ \* }3 `" E2 N
}
, U0 q0 q- [' m. n" Xprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
8 N  T2 F! _$ }+ x& w# n' s& Yspace,digit,others);
" T  S  C; |% n7 A' x$ U- M. i}
4 J$ m1 X1 j0 K' T9 V. T==============================================================
# @  T! s4 ~  M; M3 q【程序18& G) Z( a/ ~5 \4 z
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 ' ]  E0 c. X' k2 F; V
共有5个数相加),几个数相加有键盘控制。
& W. d6 j8 h- f4 Y/ ^1.程序分析:关键是计算出每一项的值。 + u, S4 S+ X/ G& \4 L) {
2.程序源代码: / Z. D# n  x* o! o6 V
main()
5 d& x# X  k) u6 g" ~, M' W( g/ g{ ) x0 o# b7 w( S: a6 a$ [
int a,n,count=1; 2 q1 o( j! Z) ]# N% I
long int sn=0,tn=0; % D4 S, T1 X: Y
printf("please input a and n\n");
9 |( ~  _7 B( o5 U) ?/ |% Y' H' k$ Qscanf("%d,%d",&a,&n); 2 b; K  k. q  H+ B9 T/ ]8 Q* I( z
printf("a=%d,n=%d\n",a,n); 9 s$ P% N" I0 N3 [$ j2 k. F4 V% q  t/ j
while(count<=n)
4 a4 M4 l: v# m{ 1 X  {+ k% I* G4 ?  c
tn=tn+a; 0 n0 J2 Y4 A) M. E. n3 j
sn=sn+tn; : n1 A3 R5 \7 c( S4 ~! A# l
a=a*10; ) b5 X. u; Y$ @! L3 K, S& w. ~: \
++count;
" W. v5 _0 p$ {% j3 f7 {! _}
% Y# M3 L8 b% p, Q# C" \printf("a+aa+...=%ld\n",sn); 4 m$ R0 @; {9 N- b1 v5 a$ P
} ( E0 N& a6 @4 k( }  R" T, S
============================================================== 5 ?; R, [5 |$ J8 a4 M) x
【程序19
& D( m  z  E3 ~题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程 1 E% V# s7 e# x% _/ I" T0 y/ R% k; k
找出1000以内的所有完数。 / ~" D6 A1 Z7 `) X- y
1. 程序分析:请参照程序<--上页程序14. & C! {" m" [5 C% K3 V- J4 g
2.程序源代码:
4 ]! o3 V* D8 J8 I9 Kmain() ! v- _  a3 l% M, y
{   O. S/ W% k# h- b5 p! A2 F+ [
static int k[10]; , T/ k2 _- L; M" L' v' P* u
int i,j,n,s; % Y( e& P/ |* w* x" d" u$ s& t* d
for(j=2;j<1000;j++) ; w. F4 k4 f. R9 W
{
9 I; S  `+ b6 L) Y& [, H# {  }n=-1;
& p7 [# w. u* {6 b/ ls=j;
3 l; r9 i/ J/ X. \for(i=1;i {
' `" M0 S4 C7 Tif((j%i)==0) 6 i  }2 y" h0 a8 a
{ n++;
: p+ N/ Y# y. X; Z' h0 f: Cs=s-i; : \( V. r: s" l9 V
k[n]=i;
9 H4 t0 R2 ~0 x4 k  a, X9 ]}
& s: ~& I5 Y# b  d1 F+ Z: d8 q}
- z/ t" e7 ]3 c& l% iif(s==0)
  e+ Y% G3 g0 @" a, H* P{   M6 Y8 R) O  g$ s: h9 Y
printf("%d is a wanshu",j); ! e) ?1 S4 m, n7 i
for(i=0;i printf("%d,",k); 7 y6 l/ ~7 [3 c* N8 M. o( I/ I  b/ X; p6 T, s
printf("%d\n",k[n]);
- V. a1 `% m% j) Y+ T}
9 I3 J, F2 m; S# T/ T* B, x, {, e}
6 X$ g: Q- G) Y* `6 E} * X& r- U" s# Q- h$ {3 ]) s
==============================================================
$ _( u0 |( V( `. a【程序20
( D+ ?& `8 Y9 ?; S$ K) o: |/ ^+ ~题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
0 t$ d8 ?, B" Q) o10次落地时,共经过多少米?第10次反弹多高? ; \3 A" {* d! f7 z" L/ |2 x' O% L
1.程序分析:见下面注释 3 M* Y+ u3 W! c5 K
2.程序源代码: 0 N6 `. }0 Z7 @7 ~" X- u
main()
$ B. L& X2 o$ j  G{
: F# m' R4 \: n8 b( Ffloat sn=100.0,hn=sn/2; : W2 F* J1 @- B
int n;
0 _; h- W+ l9 m! T  q. Q2 ?8 _for(n=2;n<=10;n++) - }1 d$ ]/ A, H$ H, R% B7 n
{
. W5 q) Z. L: x" osn=sn+2*hn;/*n次落地时共经过的米数*/
" S7 V: ]3 c/ i3 ?" ]hn=hn/2; /*n次反跳高度*/
( Y' V6 k1 X7 y; a: F& ~} # N6 }4 k8 h) U' f6 ]+ f7 H
printf("the total of road is %f\n",sn); 4 O. o+ h/ D* y* K
printf("the tenth is %f meter\n",hn);
, d# G, @, R  G+ A* O}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
% j+ Y) n& Q5 W: V( G% p4 f   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
% m- R$ A3 o" z; S: P( O7 `! M   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
) [: a8 q* s; d1.程序分析:采取逆向思维的方法,从后往前推断。( Y# q9 M7 f7 Q6 ^# g  Y9 }- h
2.程序源代码:
; q2 w* x5 y7 O  A7 \+ p: @main()6 U9 I- }& R% y) H. P2 t9 D
{9 g6 `) W) N9 g) R, ^
int day,x1,x2;; N8 K4 m, H+ |0 f; C# C0 [; D8 r
day=9;) C& v4 D* Z; w+ i% f  K7 D
x2=1;) K$ r0 E) E& ^3 @
while(day>0)/ g! Z+ q, o3 q4 U' A0 V; I
 {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/3 k- D& j* r; o+ F+ s% h1 [
 x2=x1;
1 o+ X+ ?2 c1 m, F( P) H* {0 p! u) J day--;( U8 H' q" V. U$ c9 o3 B; w* a
 }
, q* \! {3 @  c; m9 }" f+ qprintf("the total is %d\n",x1);' ]+ u' @- }0 Z5 h. f1 v& V
}! o1 |" R$ `% q/ `% z
==============================================================
8 g# D5 f4 O2 t4 i. o【程序22
% {0 D, k1 c5 f& C0 S题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定, F- d% |) S6 ?6 D& @* X. o
   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出6 M* A7 ^7 r/ D7 Q
   三队赛手的名单。
% t" p3 T% r8 i! A" f) F( i1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,
7 S+ P! `2 H6 C7 ^2 b9 x! d6 Q4 p      则表明此数不是素数,反之是素数。       ( I4 e* s' C7 N/ C
2.程序源代码:
, K; D6 U# P( b1 cmain()- b7 j" x  I' j: U& b
{! Z4 E7 X$ H, t, R; K2 g4 I# _
char i,j,k;/*ia的对手,jb的对手,kc的对手*/2 O$ r/ {% A2 C8 e8 N/ b2 F
for(i='x';i<='z';i++)
/ ~, |4 S9 h2 u6 V for(j='x';j<='z';j++)& H4 L9 t* l1 F( `# ~" V$ C
 {( ]; Y" n) `+ J; C0 e& R
 if(i!=j)
; B! _1 X- S% W2 {/ D  for(k='x';k<='z';k++)
- l2 I& ^8 u' O7 n  { if(i!=k&&j!=k)
4 K) h; z( {  [' j  Z5 j9 q' n   { if(i!='x'&&k!='x'&&k!='z')/ O" `) H! A: r3 n7 `% @4 s
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
1 z9 }7 Q1 |. s9 r$ M, t   }
. S* F+ j; S. U. R) A% b  }
% W# X8 x" a' J  n5 ?2 I7 w }
) ?8 g$ k5 j) F4 i2 o% y}
6 K: N* m' J: k4 j/ k& w0 a, w" Y==============================================================
* [3 k/ U6 O- X: T【程序234 C6 Y" k4 s' j* G, T
题目:打印出如下图案(菱形)
*
) k# ?* e' G% M% b4 }# `***8 c$ P. m" T9 R% ~/ h& `7 S
******
5 b; D' J4 y# {/ u2 K& E********
5 @2 }& `. X0 e9 |" }; q: r6 s# Q: W******. i- g& l- q# Y* s7 q# y0 d0 A
***
% H/ k6 {, g5 C% F# K) p7 W$ F** ?0 b: C& O/ P7 V- o
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重: H) g+ D' r- y
      for循环,第一层控制行,第二层控制列。 ) v& N/ {& q% ?4 V! p
2.程序源代码:
: e! U& d  ^) K! n; X' }" |main()& W) `$ A# ?2 I# b8 Q
{* ^1 C' i6 @- Q4 s2 P7 p5 z6 i5 s
int i,j,k;) \- t) S, L" r
for(i=0;i<=3;i++)
3 N- @! [5 o" G {
9 i& s) M/ ?* m& Q, e$ F' S for(j=0;j<=2-i;j++)
/ n& V" H. U- Z8 U3 J2 h  printf(" ");
+ b+ \# ]1 f8 f for(k=0;k<=2*i;k++)
) Z* o0 c: l1 i4 H6 X* \( s/ P  printf("*");
" N8 N9 ?7 K  U5 X9 X1 ?% O printf("\n");) L& [! Z' _2 g0 a0 @2 X+ j0 }
 }
& v. f/ \8 m- R" `) ifor(i=0;i<=2;i++)1 ~" x' O$ f, L  s4 w5 A, q
 {
; J6 H& V$ j; Z for(j=0;j<=i;j++)# ^- N% P( v$ g6 }) |+ r
  printf(" ");
- T2 e$ `; Q( p( k( U# U9 r for(k=0;k<=4-2*i;k++)$ P6 Z0 x7 n) ~5 p: C! y
  printf("*");- B8 H& {0 |0 v) l
 printf("\n");1 r' H! [: g) K: |9 ~3 m
 }; Q1 z( ~9 v8 ]" k9 N& r! Q8 T
}
7 i6 T9 s8 q" |==============================================================4 o0 A, e7 }5 W, P5 G! V
【程序24$ l/ g7 _: `. i( h4 D6 @( H, G
题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
4 e  [4 ?& {, P( S1.程序分析:请抓住分子与分母的变化规律。
% c- b) r2 d2 m2.程序源代码:. }; Y2 f$ c" o! h
main()! H; b$ n% ]( V
{) o! j1 \! ~: _! }% t& q+ q, \
int n,t,number=20;+ _+ \0 @4 g# `/ l
float a=2,b=1,s=0;6 p7 r4 g  _8 L
for(n=1;n<=number;n++)
9 `+ q# z# l, O- C6 z {  H7 V1 n- Z" q1 G6 ]2 l
 s=s+a/b;+ Q* j+ w9 I+ S3 r" @5 C
 t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/+ }  I  D- s& s! C* K& S
 }" q% b% ?6 s. F! ~
printf("sum is %9.6f\n",s);/ r9 v( F+ ?1 r/ B: T8 C# J
}2 P9 D! I! R1 `$ |, s# O
==============================================================
+ y# p. K5 N+ V( e. ?/ K9 f【程序25嵌入式学习企鹅要妖气呜呜吧久零就要# ^' s$ x6 f/ F8 I, D
题目:求1+2!+3!+...+20!的和- S, |/ D+ }+ e7 E3 k
1.程序分析:此程序只是把累加变成了累乘。
5 `) G3 _* ^/ W+ F; e  _2.程序源代码:
7 Q* o5 _( S  A) bmain()" E8 J1 I5 q8 N1 |% E
{
  D' E* @% S3 |$ E9 p8 kfloat n,s=0,t=1;
9 \  n% a- l& B2 r" Q; wfor(n=1;n<=20;n++)
8 s/ w+ p) |5 z. p) q {
' ?9 _$ J$ ^$ T2 q8 p t*=n;
3 R+ j! E5 D/ {  U s+=t;
3 R9 Y4 h. m6 r; y# T* J }
, \/ u8 t( O+ ^% ?printf("1+2!+3!...+20!=%e\n",s);
- A4 Y8 j# f! T}
  v$ Q) c- v  \# a$ ?: z# q( Z! U==============================================================/ q0 x* _. I& r& i! d) a4 N; v
【程序26
" A; i: H0 A( O. ^& z, D' h题目:利用递归方法求5!& [* _7 u% c& W, d% t# d
1.程序分析:递归公式:fn=fn_1*4!4 s7 l" R. I+ d9 _
2.程序源代码:
3 ~: M2 C1 {4 ^' M% e#include "stdio.h", ?6 [* l5 P1 w" f3 H; N" {% q
main()
7 @+ i9 @9 h5 B$ x( L+ H{
* F3 }5 K, N0 B5 U# q- C) _& mint i;
) D5 `3 A) M& A' A2 u; B  r3 Hint fact();0 u: N' n% P* J, o& y: A! s+ f
for(i=0;i<5;i++), W$ l1 e9 `1 d$ V7 n$ a5 A: g
 printf("\40:%d!=%d\n",i,fact(i));
( ~7 p$ ^: a) P4 \1 o& `}
# |) k5 R+ R2 L. iint fact(j)3 _8 g& p& y8 H: V# `
int j;
7 K. R) \$ t& D4 @{% G( w  N* R4 |  O/ z& O1 u
int sum;9 o, q) x& Q. q1 Y, D
if(j==0)+ k+ k0 E' T. S' m  O( w4 n
 sum=1;, A6 x, [  j' C: R& B& ^: k5 ?$ c$ G
else1 J8 [7 |. p9 A" H3 L2 }5 z0 j
 sum=j*fact(j-1);
/ V6 \+ k7 K, e5 kreturn sum;$ ^* e7 X/ D# s0 S) c1 I! ]' n
}
8 O; l# c+ J8 z1 B. L==============================================================
6 g& ?# z+ U) G





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2