找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

C语言经典算法16-26

[复制链接]

114

主题

136

帖子

1000

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
【程序16
) i! M3 W. q; d6 t题目:输入两个正整数mn,求其最大公约数和最小公倍数。 : k% e" k7 n2 u; m4 t/ T

+ |" s. b' y. B# |0 H; T
$ ^$ d% v  K0 ^" A- H- X7 Q1 Y
8 O' S  @0 o9 T* D2 P7 }7 g. O作者: zhlei81 2005-1-22 11:30 回复此发言
" A. X, G$ o4 v% x2 C  H* \
% V5 K8 G; L5 o- F1 E0 f$ l6 f- B-------------------------------------------------------------------------------- 4 x. {8 x2 f) J* K  C

2 h" b+ a/ i# n3 D4 回复:经典C源程序100) z  H1 I9 ~7 j4 f
1.程序分析:利用辗除法。 3 V6 }% U4 Z. g" G5 Q
$ U  V8 ?( ~. h: X
2.程序源代码:
+ ?  R1 |- D$ ]( c3 Qmain()
, v* o- b: Y: i{ ! M  @. n' R. d. a* }3 g: p
int a,b,num1,num2,temp; 0 O) a; N% y! T  q* J# z+ S
printf("please input two numbers:\n");
4 V# _9 @" c6 d: U% G# bscanf("%d,%d",&num1,&num2); ' V* B7 A: _$ j# {$ k8 r
if(num1 { temp=num1; * V9 @1 ^% t$ p! S# T! q0 K4 d8 F5 {
num1=num2;
- C' i0 d9 T' Mnum2=temp; 6 `4 O& c& o% ~0 m
} ; v/ U* M# b: @9 Q! L2 C
a=num1;b=num2; % s( B  E6 s, x, X( W
while(b!=0)/*利用辗除法,直到b0为止*/
' i2 q, U* z2 K; ]4 }{ * s" Z5 X) s& M
temp=a%b; $ B$ G. K5 t; [8 Y6 F% w
a=b;
8 P& r, t; v$ h8 c( R( {* ^! Ob=temp; / u. t1 g8 h% w
}
/ K% D, l' Q" i3 G' `2 S" `0 xprintf("gongyueshu:%d\n",a);
& a: A1 k) Y  fprintf("gongbeishu:%d\n",num1*num2/a);
* ^' `* g2 S' p6 v. k} % A# o6 ^' v( Q
==============================================================
( V' a: p+ f' I! P$ {【程序17
' |% b) T7 I/ R8 |, g4 F$ h题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 4 ?# B) q* `" N( j
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
$ I- i$ L: E; U1 O
& D/ D0 _+ _. l& ?% H2.程序源代码: % F$ U1 z) R: [# e+ d' X! |- K
#include "stdio.h" ; d1 b& ]+ I  F4 t1 k$ P# p
main()
7 t; j, }0 M: V0 V9 \, w( Z: s{char c; 8 i, r) O' O  _& s+ q9 a) p" m
int letters=0,space=0,digit=0,others=0;
3 m9 N0 o1 v; ?. D- s# M3 Hprintf("please input some characters\n");
& q4 y+ U, M( }) I8 X- v$ ?% U' \while((c=getchar())!='\n')
2 X8 u. l  C! ?; m{   W& ~- h4 O  x! m5 ~8 k: S. |
if(c>='a'&&c<='z'||c>='A'&&c<='Z') 0 o( d- g8 O# l
letters++;
: h1 l' ^. ~" o9 @0 E7 z& f; l  `else if(c==' ') # I" o8 `( q3 @' L/ C3 D) V( f
space++; % ~- s! n& [- c" f0 r& \. Y5 t
else if(c>='0'&&c<='9') 2 E# g8 Z4 Z% L4 W
digit++; 5 r7 A4 ^/ i, Z, b: [
else
1 Z1 R+ s% W, i. M4 gothers++; " c+ D# J; r3 o9 L3 F" k6 i) `/ n8 }
} 4 a4 R' E6 }4 j: B: d. p
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
% M( x  X6 a9 L/ o. {" r& }space,digit,others);   T  c* @2 O1 ~# S* b
}
0 q3 G  H# ?, N! K( R+ r. F==============================================================
& e: t: z  J  t1 F' n【程序18
- e. B& U5 }# y题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时   v5 }/ }: O/ m% K
共有5个数相加),几个数相加有键盘控制。
6 @# W: D; j5 r4 k. o5 p1.程序分析:关键是计算出每一项的值。
& o8 U9 D: H  n- w+ _! j! m4 G2.程序源代码:
3 k, Y* H% E$ C, b$ ~main()
  F, n: `% ~- C9 a1 L{ 8 Z+ v$ i$ D3 t8 t( F
int a,n,count=1; ; c7 I+ N: Y% u3 E2 {/ A. K" o9 g
long int sn=0,tn=0; . B8 r7 k2 j! f# P
printf("please input a and n\n"); 0 B2 |; Z8 W! b7 a2 |7 _* v( V
scanf("%d,%d",&a,&n);
9 Q  H" K( R  F+ W* b1 u/ \" i) Qprintf("a=%d,n=%d\n",a,n);
: v* F5 X6 c  c' t& l6 j" N* jwhile(count<=n)
% j# |; v& S( J2 I9 T{
" C. o, o1 N0 L9 ~tn=tn+a;
: E. @$ ^5 P) U- wsn=sn+tn; . N4 X- `) y) i$ j
a=a*10;
( u5 x5 C; q! |$ T0 x++count; # D3 s3 }& S9 T# [4 q0 N8 c! S
}
& d6 a' J/ e- sprintf("a+aa+...=%ld\n",sn);
! t# S/ B% a& j}
6 P) J" D" L; U2 n1 Y============================================================== ; ~: |* A6 h8 S" V
【程序19$ S8 u$ M5 [, p8 K# E
题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程 0 d' E) F8 i/ A) b6 F+ v. t
找出1000以内的所有完数。
' l) i5 h7 [+ d4 p9 E1. 程序分析:请参照程序<--上页程序14. ) l8 P& l9 ^% Y3 t3 A- }5 L: d
2.程序源代码: ! O% \1 A, e7 o
main()
' {  t. A2 F4 z( O+ l8 s{ - w4 Q; [0 F! j( k: C
static int k[10]; & m  T4 G- G" S7 J. K1 I
int i,j,n,s; 0 _! `& i3 S* z5 j& @  _) W
for(j=2;j<1000;j++)
" X, Y8 V7 I3 @( W{ 9 t* Q9 K# @# y0 I0 Q
n=-1; * p% W7 e" B+ ?( W. M- C9 o) l
s=j;
6 `, F! p* M2 k; r. D7 Xfor(i=1;i {
0 V, e# w' S- V- g+ g5 G& Gif((j%i)==0) 5 O5 J2 k& O+ ]2 k& _
{ n++; # o( g# {# }  u) D4 q" }0 m
s=s-i; 1 p6 r, c* X* E
k[n]=i;
) I, }3 Y$ O: I8 `/ n" \} & ^1 P# s( ^9 V* P# ~
}
$ `: Q9 P) @& @% d/ W1 gif(s==0) . y5 p4 n* _+ k; v
{ . d( Y( u0 j# p" T
printf("%d is a wanshu",j);
, J  b0 M; ]' n' jfor(i=0;i printf("%d,",k);
9 h& k" _' C0 [  d2 L) l' s0 I! Rprintf("%d\n",k[n]);
# }) j9 O# o" B  G! ?} $ ^4 [+ y+ b; A: j
} . }) P" O* f2 ?- W
}
; \7 |  g6 M8 l* c- R==============================================================   e! {! \: P& \- [$ S8 ~
【程序201 f* S( y$ j$ Q- w0 ?
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
% ~4 g: r8 V9 m' [3 o2 H2 n10次落地时,共经过多少米?第10次反弹多高? - o, z  I1 x- D8 B3 N! b
1.程序分析:见下面注释
7 \* K8 \+ u2 e9 Z- G1 ~. n2.程序源代码: 8 Q' G) ^( `3 p
main() ' o1 M) ^6 j2 e4 i3 }
{
2 R9 B, v: u- \& a/ ?7 wfloat sn=100.0,hn=sn/2; % h$ s9 C/ b4 B3 G
int n; 7 M9 {8 ^. B! R' `2 j
for(n=2;n<=10;n++)
  I. G4 x. i0 R3 p, T" \4 u{
5 O, Y: `! H- s, `, T7 U! v# zsn=sn+2*hn;/*n次落地时共经过的米数*/ # a; {5 C1 Z3 @. ]  x% `  N
hn=hn/2; /*n次反跳高度*/ " L, t. _" G+ j4 Y
}
. M* e# T, o; e0 ~printf("the total of road is %f\n",sn); # n- g2 q- E5 F: ~
printf("the tenth is %f meter\n",hn); 9 s4 A# @2 |# k. T
}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个' A/ S' v9 W4 r( a4 a% e4 ^
   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
% b/ I" S. i2 c3 x1 g& N   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。7 S8 ?2 {. d$ `8 H9 ~) w3 e9 v; G' Y
1.程序分析:采取逆向思维的方法,从后往前推断。! T4 u1 U/ H0 m6 M
2.程序源代码:5 l* H6 b1 [! i7 S6 M% S2 m. @
main()% Q: s( \. d6 n5 J, U. I9 q
{7 k9 y0 D2 h: `" _% M
int day,x1,x2;
6 \8 d8 F, h. b+ j" bday=9;
; x& V2 u) b0 s; R: Vx2=1;
0 |) @7 |! p( `3 K, [while(day>0)
+ W! z% a$ b% c0 O& I {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/
0 _- S  p% n8 z x2=x1;! {* w& Y7 D  `! p" i+ F0 v0 r7 v
 day--;: @7 G  z/ K) d% z# G: J! ?
 }
+ n+ V  S. I/ X" \printf("the total is %d\n",x1);
# E' J* a8 {! s7 W) t}
0 [) P! q$ k9 @9 i+ ~& _==============================================================4 H4 R8 i- s; K+ W' E$ b- V6 {
【程序221 J+ }5 P+ ~8 v% O1 k
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定& {# n, t3 A& o
   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
; r8 q; A# }* M9 d( ?. s   三队赛手的名单。 8 ^9 Q0 Q1 n# a7 E. X
1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,2 Y: e8 {  ?) Q8 q( h2 ]
      则表明此数不是素数,反之是素数。       2 _/ _' b5 d+ Y$ R0 M5 L
2.程序源代码:
' |* L3 E7 L' P0 g- I: F, nmain()0 N' A3 d4 Z7 F) u6 U# i
{
5 B! B$ _; W2 e; C! b8 g; O  Dchar i,j,k;/*ia的对手,jb的对手,kc的对手*/* l. j# |+ g- H# Z) M
for(i='x';i<='z';i++)$ F, `; W3 {; i
 for(j='x';j<='z';j++)$ ?- K; W; m0 P% G. i
 {! P+ T( M) @7 J  b) _( q+ L
 if(i!=j)$ F- |( @; U( `# S5 F( `
  for(k='x';k<='z';k++)7 ]% k! r9 {: V! O! _
  { if(i!=k&&j!=k)
, H9 a9 D# @, w* j8 n' E   { if(i!='x'&&k!='x'&&k!='z')1 Z" T7 _: p, \  ]1 S
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
8 `/ ], @7 u' @" H9 s) Y   }
6 a' j8 c5 Q# k7 L) e& n  }7 \6 ]( ~1 ~# ?5 \2 [
 }
& {; T2 J" ]6 D0 u7 h}
1 \4 a' Q9 r& ?' Q* ~# e3 n# F/ ~( z' E==============================================================
0 N+ P, C9 h6 e! b4 r$ N' ~" }4 l【程序23
# p* \* c! x' Y0 z& a题目:打印出如下图案(菱形)
*# E( @% B9 a: s
***
1 v/ n  e$ E- ?% X" R2 m. Y; B: L8 {******
+ q: ?6 G; ]; _+ ]) W********
3 I8 c( L6 t, M$ b0 X; L******$ F2 ^9 [9 e& |4 l1 d' F+ M
***% q4 d$ a: k% o% A
*: T6 M" d* s" l; c+ _
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
9 C  Q# ^6 e: J: H$ {; S" k. B* d      for循环,第一层控制行,第二层控制列。
/ t9 j+ z& k( {2 f0 Z2.程序源代码:" ^+ W0 K/ I4 n
main()
! a, X5 w0 d: X{0 `* O1 s! z! a4 w9 ~- E% _! x" _
int i,j,k;. K7 ]& L& y" R/ j
for(i=0;i<=3;i++)1 _$ Z  p3 K* A: ]
 {& r( y" u% `* I5 ^8 a" q+ w) a
 for(j=0;j<=2-i;j++)
( @, |# n4 G/ i  printf(" ");+ n% [0 h5 b3 o/ ~, L
 for(k=0;k<=2*i;k++)
2 I7 c/ ]+ x. W% Z; q  printf("*");& S* K* ^; _, A3 L0 Y6 V! ^
 printf("\n");
6 ~$ n* D! F/ [8 I+ H }
2 q7 M3 [/ ]; m( e3 Hfor(i=0;i<=2;i++)
/ }1 v+ q/ W* t {: z) r' }( h- \9 c6 t
 for(j=0;j<=i;j++)$ @/ m4 C8 c2 F7 A2 ]- i- Y$ |
  printf(" ");
4 x+ T( e0 j+ g3 J9 W1 `5 m+ ? for(k=0;k<=4-2*i;k++)
3 p' N- `4 L" o  printf("*");3 a  |; L% U! ~* {2 S: T: r
 printf("\n");
/ [5 C; l) \+ ` }
) q+ b4 I7 e7 X' b  a}( B. }4 ]) ]4 a, ?' |4 R6 }
==============================================================
: j( B+ _) J& [$ X/ K9 b1 n3 M【程序24
! @7 L3 r- h5 t# K1 q; g题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
, i7 x. v, {9 ?8 B6 R6 W4 Y1.程序分析:请抓住分子与分母的变化规律。   E2 l; ]$ W. G$ c4 |/ n: l" }0 D
2.程序源代码:
, h  D! k; M7 v7 }" w6 |main()! i7 M6 l* H3 w/ E# C) k
{
0 ?  e. @* X, G$ v# P0 pint n,t,number=20;
+ L  [5 s/ Y: p+ T& ~! Cfloat a=2,b=1,s=0;
8 Z& Y0 J' _. p+ `( ]4 Cfor(n=1;n<=number;n++)
  H1 t/ o" d& R- r% Y: N {
: @0 f; ^0 Q" \9 _) q s=s+a/b;
9 a; w8 f1 B1 }: ~* c t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
/ x- i0 k1 r8 O5 ?( j, X }8 H2 l8 ]6 T* `' }
printf("sum is %9.6f\n",s);
  h. x& O3 [. E: y. O! S, P}( W. e, ?' f5 D6 i. O
==============================================================
0 [/ a- a  \1 v& s【程序25嵌入式学习企鹅要妖气呜呜吧久零就要
7 b; w- G6 P( M' I8 \% {题目:求1+2!+3!+...+20!的和' Q& A: r  h7 X2 K  m# U
1.程序分析:此程序只是把累加变成了累乘。
+ H1 h- m$ D1 k9 x/ D. v/ T2.程序源代码:
3 u$ f& i& J0 y; _/ hmain()2 ~) k! d( ^- N9 d
{; w# v, v2 t9 C5 p3 W
float n,s=0,t=1;
, Y; n! A6 i& @+ d/ [for(n=1;n<=20;n++)9 b( P9 p* E; K! v* @, X
 {
  }7 k; m8 v: Q+ _& s4 k t*=n;
( z9 p0 ?) \: K" ~2 \; t% H s+=t;
# z/ I0 v# i/ ` }
: d8 W* K. n1 ^printf("1+2!+3!...+20!=%e\n",s);
# M  @( e9 T4 Y  E7 n}
1 R* \' t; t- ?+ y  V( T; y6 ]==============================================================
: X' W; l7 Y  _0 \2 j【程序263 |7 \& ]! }$ }/ G$ l% r
题目:利用递归方法求5!
5 ^: @! u' E0 U; L7 p1.程序分析:递归公式:fn=fn_1*4!1 m# w2 T$ Q8 B; K
2.程序源代码:
6 c& {) o/ K  ?6 ^1 j& o9 S5 K7 ?% A#include "stdio.h"
  l; c1 n* p) l2 k9 _. j# c7 smain()
1 |1 S$ ]% t) q, I4 D  H2 e{
; s8 a" M* [" K% {. v$ l' a+ gint i;' V1 Q2 I# y( |5 i' S  `
int fact();
) }3 w  m% O0 N. h+ V, rfor(i=0;i<5;i++)
: o' v+ \" A) A! F, F$ G3 C printf("\40:%d!=%d\n",i,fact(i));
+ j( O& M7 w# H: x$ `. e1 {( R# i}
! @( e) `5 b$ m7 Z6 Dint fact(j)  D' Q9 X. ^* f
int j;
) H8 m$ O, Z/ s  C1 @{
0 P1 s' c7 ^# M& s# F9 i8 Jint sum;4 p1 l: V3 Z7 E! C. b1 E
if(j==0)2 a0 V( s1 N# R' p$ @& T
 sum=1;# S7 ?* y4 O$ G- P
else
' U( Z9 K' q; g3 m: j sum=j*fact(j-1);. i: u9 a" S! [+ [" o3 {
return sum;& w3 K' P0 J- B# @/ \( E/ {3 b: X
}
  A6 L8 u+ ]$ l4 {==============================================================
' ~5 L0 x  e" @1 M& ^" U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-5 06:17 , Processed in 0.082367 second(s), 32 queries , Gzip On.

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

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

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