找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 66|回复: 0
打印 上一主题 下一主题

C语言经典算法16-26

[复制链接]

114

主题

136

帖子

1000

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1000
跳转到指定楼层
1#
发表于 2017-10-6 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
【程序16  [" m$ X  L8 C8 [* l5 I+ M
题目:输入两个正整数mn,求其最大公约数和最小公倍数。
! 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)/*利用辗除法,直到b0为止*/
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=123.编程 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.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,: 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;/*ia的对手,jb的对手,kc的对手*/
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/13/25/38/513/821/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! [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-2-1 06:57 , Processed in 0.055954 second(s), 33 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表