找回密码
 注册
关于网站域名变更的通知
查看: 331|回复: 0
打印 上一主题 下一主题

C语言经典算法16-26

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
【程序16* m7 i) c4 ~/ R7 v0 G* m
题目:输入两个正整数mn,求其最大公约数和最小公倍数。 . R) n* z4 e- F
. I' Z7 K$ G3 ^" K* U
9 }# K3 r+ h5 T# P" X* E

# W/ ~8 t' u, [9 c. y, v作者: zhlei81 2005-1-22 11:30 回复此发言 ! Z/ w7 n2 H; Y

  ^8 V  M; L2 y2 i" ]-------------------------------------------------------------------------------- ! Z8 P/ b- ^+ I( _& _
- j3 ?, r. i8 R6 ^4 `
4 回复:经典C源程序100
, f+ N. W+ K/ @2 ^7 _; @; y# K1.程序分析:利用辗除法。 : }% A4 U3 E" B) B

( O4 y  M$ m+ @% z2.程序源代码:
) ~; _# ~) P" U$ H4 Dmain()
  F- P  t2 n7 A( b  V4 l{
$ c* g$ u8 v9 p/ xint a,b,num1,num2,temp; # o  @9 |& |) A" O
printf("please input two numbers:\n"); $ k$ n" D5 x; j; z, V
scanf("%d,%d",&num1,&num2);
$ x& g/ j5 J# D/ k/ aif(num1 { temp=num1;
! w! k! G  W& i$ xnum1=num2;
$ j$ |! o' @8 Y- U" D- Bnum2=temp; % ^# t! E2 W! s6 p+ S% ?
} " L# A7 S; F0 Y1 g
a=num1;b=num2; 9 C5 C1 h1 i- {1 Z3 h/ m
while(b!=0)/*利用辗除法,直到b0为止*/ $ }" I3 H, Y/ A! F, H% ^
{ 5 n; d4 `* a& B
temp=a%b; $ B0 D4 u5 f1 W
a=b; $ I7 ?4 X  N# z! q
b=temp; % t$ c7 X$ S! ^( W$ |
} 7 |- D3 m2 S/ q! Q% X: T  H
printf("gongyueshu:%d\n",a);
$ y2 y6 D* ~$ {; t( z( G( E- N- P8 ]printf("gongbeishu:%d\n",num1*num2/a); 7 ?8 P3 N- J+ {0 z
} : O3 }9 \& G' m! Z) V
==============================================================   E1 x# i- F2 }4 G9 s; g$ R8 a* _
【程序17
. V6 G  |) u3 {0 Q; A题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 ; R# I& Y- e+ B7 q2 D! b8 y
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
( [4 ~5 C8 a3 \3 R4 y2 W5 D6 _
: m' X* y5 d) q( u2.程序源代码: ; |/ @7 h9 Q7 j( ]" z
#include "stdio.h" , S. \) G1 [# O
main() $ E! i7 }5 W- B# K2 q+ Y2 A! }2 \
{char c; ' F5 ?& n' _% t
int letters=0,space=0,digit=0,others=0; $ [# C2 N1 f0 r( o- L
printf("please input some characters\n"); 5 i" ^, X& x1 E: q& c& w7 z
while((c=getchar())!='\n')
! R4 ^9 X: h- ~9 @{ ( a! ~$ m7 ^, e/ w6 z
if(c>='a'&&c<='z'||c>='A'&&c<='Z') ) j1 w' e/ j5 {, Y
letters++; $ [) z2 W9 R' F" j1 z
else if(c==' ')
- Q! {2 m) C+ V  w) D4 uspace++;
- E4 I6 w& W; jelse if(c>='0'&&c<='9') 0 v1 B1 Z8 g/ A1 y& G9 O# C8 H, V
digit++; $ Y4 t* h( g, Q) k! t: {6 S  ?. y7 h
else
) ?% x2 k3 Z) \others++; " q/ R) i+ B$ Z( T
}
- `% E3 `; w6 w; Zprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 1 [) D$ h0 p4 a" O! C# J
space,digit,others); + ~6 q/ J/ v- {: }
} # `1 E  k( r5 D, K# Z3 u5 r) Y+ g
============================================================== 8 J4 H3 J. S! c1 W
【程序18' y8 P6 i3 h6 e9 \8 J
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 . J1 }+ G1 z1 N9 ]' ?
共有5个数相加),几个数相加有键盘控制。 2 T! }$ J9 D" n
1.程序分析:关键是计算出每一项的值。 $ t& L2 Q: g3 X, C( k
2.程序源代码:
- n1 Y0 {3 t6 I9 q' [* T- j4 mmain() - v% S' f: t, Z, g  w; n
{ & @  o, ?3 g. b2 D/ S+ g
int a,n,count=1;
1 Y# B7 e* ?' _2 B6 llong int sn=0,tn=0;
0 F+ T0 w  ]# L; ]printf("please input a and n\n");
0 p. B5 ?- v8 w* Q: E- k6 Xscanf("%d,%d",&a,&n);
# j6 a6 e: [: `5 Qprintf("a=%d,n=%d\n",a,n);
5 d7 t% g- S$ Z5 f& uwhile(count<=n) " ~$ f& t/ |5 N8 |
{
3 g" H9 e; F  Q! P+ ~tn=tn+a;
" w) W; f9 W. ~$ D% k, xsn=sn+tn;
* X& ^6 d; M# I: I9 i9 la=a*10; ; M+ J$ k: D3 @$ N9 |* l
++count;
. f! C/ w' T- P& w4 F5 K; x} % |; \' _% u# h4 y
printf("a+aa+...=%ld\n",sn); 2 s' T4 h8 j# T. j0 D0 p
}
, r4 ^5 `5 ^9 M0 h! o  m============================================================== 6 U+ Z5 l: u& P3 Z. K# ^
【程序19
) N0 O' d. ]: E; y& O题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程
4 p: I, d7 x, ]$ T找出1000以内的所有完数。
7 I' ?( t, N- F0 o) v5 l- z& U1. 程序分析:请参照程序<--上页程序14.
* j  ?) A  H" ~2.程序源代码: ( q' u! @% G8 I4 {
main() 8 L9 [- |$ W- H* {4 o
{
2 S+ o  i% c$ q# jstatic int k[10]; % R( S0 ~$ s; \* K6 K; x
int i,j,n,s; , a) _0 a, O4 R  ?+ u
for(j=2;j<1000;j++)
' k8 p/ j% P2 m# b- I. G8 Z{
% A- T2 S+ l7 r% l, fn=-1;
7 }3 M$ i! u  js=j;
) }/ d9 P0 G9 Z$ L' ~$ f  i! Gfor(i=1;i { 4 \$ B( p; Q9 A# C3 o! S
if((j%i)==0) % A* }8 }* T/ n0 n2 E% [" O9 \
{ n++; 4 M2 w2 i# _; X0 m% y& ]& ?
s=s-i;
! T. k: o' u1 L7 v+ jk[n]=i;
9 M1 J" v7 o) |4 Z$ j( F; h3 v2 x} $ Z7 f0 r5 ^+ `6 T1 J( C( w, t
}
/ |- {0 ?) x  E1 r% H2 T. hif(s==0)
* g& e8 L- ], ~- X) h1 U# z{ , S. V% Y! f1 {3 A! W( R; B
printf("%d is a wanshu",j); 0 `5 E/ `% g% y: J: t
for(i=0;i printf("%d,",k); ' _: E* R% s! U2 |5 J" i
printf("%d\n",k[n]); , _$ N' x# m! u: ?
} ) T4 W! X9 d4 L, ?+ }
}
. H1 G  v6 |, M0 u) S( F$ G}
" Q# y. Z$ u4 x; h- d( D# L==============================================================
# _. l0 w0 W' P; e0 \' V9 D# z" V【程序20
, y, n+ e% x3 R2 b9 v& B题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 9 }% a+ E. D  R: F
10次落地时,共经过多少米?第10次反弹多高?
) m9 q7 Q+ }: y  o1 A1.程序分析:见下面注释 - p. _) V$ B- s( z+ ^' P
2.程序源代码: 1 X2 ~0 |0 X, J+ q9 Y8 D- P
main()
' f' t* \% k" k4 e" j{ 8 b" c1 b) A& I: b* k+ K! L: g
float sn=100.0,hn=sn/2; / o, g, T( o: M, ~
int n; 0 e9 o) j/ r( v6 f% l4 Q
for(n=2;n<=10;n++)
, R& d: o1 T% {4 T8 O+ ?3 B{
% ~' S0 u8 @9 I; m! Nsn=sn+2*hn;/*n次落地时共经过的米数*/ 5 B: H' J. V; r; E+ T3 w
hn=hn/2; /*n次反跳高度*/
" x2 L% B5 V& B1 C* Q' Q, T} $ Y6 t1 i" A+ A: c- {
printf("the total of road is %f\n",sn); 3 G# n: J3 O* p/ Y: i0 m8 Y$ ^! F
printf("the tenth is %f meter\n",hn); ( s( D' K$ A: n# E. P& ?
}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
. w# z) e1 j8 g# h- b* d) G3 c8 N   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
2 Y$ P/ Q  V) S! w3 w5 i   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
2 H# G" G' v# g! f' u1.程序分析:采取逆向思维的方法,从后往前推断。5 l: d9 o* _. o' ^! Y: C
2.程序源代码:3 K8 ^9 [$ F, E' c1 y5 O: A
main()4 n0 ^9 A) d: ?) ?. E
{& ^/ G# y$ C& M9 q" X- I
int day,x1,x2;1 N  h# {/ R0 q9 b$ J* l& F
day=9;' O4 h+ D+ g3 U: Y" m' h& c
x2=1;  N; N! ?% L+ E
while(day>0)" W# ^. S% @' \# S( u5 a
 {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/
6 p; v" B7 \6 {- } x2=x1;
# W8 V5 s3 j1 }9 q( R9 C/ p5 X3 q day--;
! G( F5 e" U# o. m8 B }
5 H. @: b. a1 z- Hprintf("the total is %d\n",x1);# f4 h- v7 J7 M8 i% \- E  d
}  j2 Y. a- Y( _
==============================================================9 ]* j' t* ?/ A  A4 H# i
【程序220 a" T# q5 y) U% _8 f9 Q1 z
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
9 s# n# j4 P# x/ z& a   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
! O0 j7 a  H5 L6 A9 C" x   三队赛手的名单。
5 @4 g9 z$ i2 ?8 _1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,
2 V6 B- i0 G8 {3 e- L7 a  M      则表明此数不是素数,反之是素数。       3 s9 Z* L% x- |. M# @; `
2.程序源代码:
  H8 i+ [4 T, k9 @- c* s6 Rmain()
  T- `  d9 P. P9 o, H{# c/ A8 S/ Y% a; N
char i,j,k;/*ia的对手,jb的对手,kc的对手*/
4 }8 I- B; J7 m- p9 efor(i='x';i<='z';i++)6 v0 S$ j1 W  s+ v; D
 for(j='x';j<='z';j++), Y+ R1 Z/ o( c6 Q1 m9 U
 {
- a9 ^" X! y$ z8 ]0 R if(i!=j)! V, X7 Q: h; N# k
  for(k='x';k<='z';k++)0 E9 n7 x! Z) Q: w. [0 g& D$ z
  { if(i!=k&&j!=k)' f1 Y) x" U; j( a6 \" \
   { if(i!='x'&&k!='x'&&k!='z')
% Q" s# Z  r& s' @$ t   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
( I! w/ {( p. [$ P/ }; Y5 K( U   }
* y0 l9 Q9 l: I$ x: m  }/ A' c9 K* R$ ?6 E' a! s
 }
: u" N8 e; J" ], I: o. b}
  \" {4 E% n* r3 f8 X' m+ F' }2 P( ?5 p==============================================================
. F6 W+ G. x4 r* H. y1 b: k【程序232 F% U' [5 B" [, q: t
题目:打印出如下图案(菱形)
*
' f# y' c' A. i, V* j( r***/ f6 }; [* \6 `( a
******+ E' A4 Y! p% Z5 _" ]" g' C- {& _; i5 F
********6 A# y6 x- E1 s0 a
******
* d* Y& V- D3 Y/ D; X% E***
) [9 T4 P5 U) b*% Q$ |" Y) W9 n' M  J
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重7 \5 {" o, F0 b
      for循环,第一层控制行,第二层控制列。
5 U0 K# y! W3 J2.程序源代码:
  g* D: R/ {. d, tmain()
# P- o; H+ V6 y{4 U# x* u3 l! c! m+ F. Y5 R' g
int i,j,k;) {4 w# q$ {# N; P
for(i=0;i<=3;i++)
! l* _6 O7 L. A! W/ L) l! P+ H {% ^4 p+ X1 A1 J- U% R1 o
 for(j=0;j<=2-i;j++)
+ v. _% M+ R4 @2 k8 F  printf(" ");0 H: k4 }4 `6 r
 for(k=0;k<=2*i;k++)" t$ b& [2 L, X& u# u8 s
  printf("*");% k+ o2 Z  }* s' @8 L1 |, m2 x
 printf("\n");+ \1 U- R! b' B
 }
' `/ i* I5 b% `4 ?for(i=0;i<=2;i++)5 D7 }, b, ^! R# l1 J  V
 {
9 ^  t8 ^( N1 G( u; ~: N for(j=0;j<=i;j++)6 N" h+ f6 A/ L$ B0 d
  printf(" ");
1 u0 y1 d4 c& f, Q: N for(k=0;k<=4-2*i;k++)
9 I/ _% O* _. j2 M+ t  printf("*");
2 {( H3 R" _1 h printf("\n");
: {/ P/ j' s. }' \$ [2 l, [ }& C1 r6 \0 K' D- Y" |+ t
}& g  n/ B/ |* I: @+ ]+ J: ]
==============================================================1 x, K. l8 j" j, u1 {8 _. D  [
【程序24
/ q% b) @: d  k, Y) U5 P题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
$ V/ c, L2 {( b3 o% g6 P1.程序分析:请抓住分子与分母的变化规律。
. Z+ U+ M" [" d2.程序源代码:
, S4 G3 X* r8 {3 b8 `* D: o2 Pmain(). K9 v' E9 u% ]) S
{
. r2 d/ |6 h9 m& ]0 y+ \int n,t,number=20;7 ^7 G: f9 }7 R* S
float a=2,b=1,s=0;, w- [; v# h" {! I: V9 ^; N
for(n=1;n<=number;n++)9 F9 }7 T/ S( P# ~
 {! ]# H0 V* M, A& l# O3 P3 Q: [
 s=s+a/b;" k+ O" t: V  ~4 g
 t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/' n9 x! f* w; m/ ~2 l
 }
5 J* J& X- B2 Y! o7 ?6 }printf("sum is %9.6f\n",s);
" B, u6 Q0 V  D' a, ^}  n$ X' y' H+ E  y$ V, m
==============================================================
# U( p2 |( W( c* r" q" H【程序25嵌入式学习企鹅要妖气呜呜吧久零就要
5 ^! X0 x6 T- Y: k, {+ Y- i题目:求1+2!+3!+...+20!的和$ |1 b) U6 ~, {, t
1.程序分析:此程序只是把累加变成了累乘。 4 m) Q0 X. o& k# F5 g7 L& {
2.程序源代码:  d2 y1 H9 \) |1 n8 t! j
main()
7 @: Q1 U; Q, z. N9 {( _* h; c' {{
/ x1 n% t' H( Y& x% ffloat n,s=0,t=1;
6 @2 s$ m1 B( t# V9 O$ Mfor(n=1;n<=20;n++)9 P* n" S/ T+ w% N: A
 {: X& \3 H1 K+ y$ A/ S
 t*=n;
1 a: ~7 g* m0 U  G s+=t;; P7 J, Z+ a. ]! l  N
 }
) ]3 g& T  z/ c% m. Yprintf("1+2!+3!...+20!=%e\n",s);: M$ C  d4 k' g6 u/ n8 q; Y: l
}7 v$ P$ I# \+ i7 I2 l* O: I+ a* {
==============================================================6 T8 h3 v: K- m- O0 r
【程序26
8 a; @, t5 @6 a, [6 M6 Z% I! G题目:利用递归方法求5!
; K5 w3 |) J5 R/ o9 K$ k0 G1.程序分析:递归公式:fn=fn_1*4!
; x) h8 j! ^! n9 m! s) A2.程序源代码:# g3 e" l0 k$ {5 J4 }% o. O
#include "stdio.h"
' U5 f, F8 }" S5 n# Qmain()6 |& y2 l! ~0 P8 _  o& f1 R( ]6 k
{
$ k" n3 q3 r& k8 b- O. T  i% n4 W0 xint i;
, B2 z. t& z" G* P  v& L( Qint fact();1 s. T: S. p: Y0 E+ T- ]- ]1 H
for(i=0;i<5;i++)" r! u! }$ @7 d- b. E0 b8 S
 printf("\40:%d!=%d\n",i,fact(i));
( `1 }+ m, L) g3 V}
# I" o) @: w% @  i+ S- y0 vint fact(j)
4 p' @0 D* G% j0 [int j;0 p; D- m4 ]9 E. d9 z
{" T7 M- u. W% _
int sum;2 K1 `& l2 Y8 y+ {4 ~; l2 G. v
if(j==0)8 l9 R9 j) ]) C  v( O7 B( T, O" n
 sum=1;
* P8 _. ~) c& o6 E, belse
: _  v; x# E6 \) s1 \ sum=j*fact(j-1);$ @4 g7 n# r0 ]3 Q, V9 d
return sum;' S! Y. w" I- h( e% y
}. q7 d$ u# [% W2 A7 v& w+ B# Y- Z2 m8 k
==============================================================

/ P! e7 C3 @" u! n  b% J8 ^: @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 12:13 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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