机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2458|回复: 1

C语言算法16-26

[复制链接]
发表于 2017-10-6 15:41:14 | 显示全部楼层 |阅读模式
【程序16, K, J8 ]5 q, n5 l
题目:输入两个正整数mn,求其最大公约数和最小公倍数。 ! E  ^$ H- h  v
6 p& H5 a1 z& m; }0 H, \3 X- k

4 K% t# `9 B2 H5 j* J: _* l
9 W$ _4 _) i. N* G作者: zhlei81 2005-1-22 11:30 回复此发言 ' l9 g; P# r- i/ V( @

/ O7 R  |% e/ {5 R5 l' l# F/ j-------------------------------------------------------------------------------- 9 Z4 y& X# _4 o9 h& J+ L, u. z

1 t$ r" I' {+ D4 回复:经典C源程序100, e$ s& J8 y5 r- v8 W
1.程序分析:利用辗除法。 8 {$ E( y% I7 Y  ~) q9 E0 {

4 r1 X& O% D2 c* d) G8 _5 A2.程序源代码:
& j  A1 e$ A9 k0 A: `main()
  {( Y4 W' F1 O# O, |2 H9 Z$ J9 I{
9 d% T$ Z+ v3 G- |int a,b,num1,num2,temp; 4 X. {3 y- Z5 Q7 a; o7 w
printf("please input two numbers:\n"); : D7 C# J6 _4 H: R/ l  U
scanf("%d,%d",&num1,&num2); 4 c* V7 h2 e( B! R( x
if(num1 { temp=num1; - L) I" a4 R- _3 _6 x& N7 c3 {
num1=num2;
$ ]1 t4 @! c1 K6 `* pnum2=temp;
1 ~. h% a- D0 Q" g: W}
  V' B* X* R+ r# y, Aa=num1;b=num2; / L4 R4 {( A  N- z5 `6 \
while(b!=0)/*利用辗除法,直到b0为止*/
1 R! ]- \1 Z% G) _$ i$ i3 n{
7 w) Y7 s3 O! x' {* vtemp=a%b;
1 L  Y) X. y" Ea=b; 7 u* V8 e  f% s+ {
b=temp; - ~& w+ ]2 v' `+ c' u8 w8 b7 N+ \
} , I9 L1 z1 b9 F; S6 B5 d
printf("gongyueshu:%d\n",a); . ~, y, d! {9 n* i+ u
printf("gongbeishu:%d\n",num1*num2/a); 8 |, @& s& z) p  M  j
}
" {$ ]9 `+ ?% P* A/ k============================================================== - G  `* P2 C) E0 z
【程序173 S8 k, Z. [; e/ g5 Y- [- H4 v; C! {
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 + N# p& x4 C4 d: F+ @2 }9 Z- H
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
7 W, M0 _5 E6 H3 b5 k- b- S, P, b8 y7 F% d, w. g5 y0 a# |) K. c4 W
2.程序源代码: 1 {0 ^2 B7 }3 v1 L' s
#include "stdio.h"
. A: H/ |4 I/ I7 fmain() 6 O8 \$ I8 e8 o+ X5 K* B
{char c; % U4 _3 G' @5 G, C' R; u
int letters=0,space=0,digit=0,others=0; % I% d/ D: V% W; ?
printf("please input some characters\n"); # B" Q+ @, z- _
while((c=getchar())!='\n')
7 S) |0 c7 S, q3 a: I{ ( U9 U! k5 Y& V6 i! u3 D. S$ g
if(c>='a'&&c<='z'||c>='A'&&c<='Z') ) e! R7 v8 [/ h& Y2 z0 S4 |, U
letters++;
4 Q. i9 o1 [( oelse if(c==' ') , y) I+ S+ F0 e4 }; m! o" \
space++; ) _- d- n& V/ Y: e
else if(c>='0'&&c<='9')
1 w7 v. _8 o2 C  n) C  x' Xdigit++; . N5 \: g+ p/ [, @! ^
else - s1 V+ E/ y2 F# z+ W! h! i% \
others++; / B/ L. z# r2 ]* L- |
}
- G6 L, b/ W# `6 r2 Pprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
4 T7 ]  R0 k" x4 u. C7 Espace,digit,others); ( l8 M/ P+ L# X/ G  ]5 f9 _6 ~
}
6 Q, x+ Z& l% J7 I==============================================================
+ n7 V% A) x% a【程序187 x# U  ?! _  l4 P3 C4 R5 L+ r- n
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 9 `1 E7 @+ g* j$ R
共有5个数相加),几个数相加有键盘控制。 2 \# d4 C8 a! ?9 N) j
1.程序分析:关键是计算出每一项的值。 ; m$ u, D6 Z, l9 J
2.程序源代码: ( Y4 k* W1 O4 P1 ]9 ~! \: \/ }9 u  z
main()
9 }) R: G# Y: l8 Z! `8 j{ 6 f9 ?' E, u/ S+ r( g) r
int a,n,count=1; . z/ W6 H" d) l! I% `# n! ^# Q! @
long int sn=0,tn=0; , Y5 R; @; b  ]) _9 Q
printf("please input a and n\n");
0 l$ c* g. H; k  |scanf("%d,%d",&a,&n);
) w+ E) R, {( wprintf("a=%d,n=%d\n",a,n); 5 g; c3 z) A* _% j
while(count<=n) ; t9 ^8 z& {3 |4 R+ A) k5 c1 S
{ % g+ I$ u# y; F3 X! q- I1 g( l# g
tn=tn+a; ( F) o& s7 y# l" U- ~
sn=sn+tn;
( P- k/ ~9 g% P: v. x7 v) Fa=a*10;
1 j% U. }2 ?3 A8 K1 ]8 D++count;
/ a4 ]( ]* C: Z1 a* s7 x}
) t8 O& j" C, v: @: ~printf("a+aa+...=%ld\n",sn);
2 X2 i# G- M1 \} , a: h, Y4 b$ g# `
==============================================================
( Q! k4 {  o$ r; I$ X$ u【程序19
6 u" I8 }+ k  ~* {: w题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程
4 L9 ]6 g2 E  y, u找出1000以内的所有完数。 ) f- ?0 h5 V8 r! K7 v4 S- e# F4 O
1. 程序分析:请参照程序<--上页程序14. ) k) b  |# j+ s  ?! R( r
2.程序源代码:
1 U$ B8 X3 n; U  I& dmain() 4 L6 `' N$ k& P0 @4 A# d! j
{ ' ]* x+ N( f/ h% C) T  Q; q
static int k[10];
, E6 L- [2 r) ]- h, Xint i,j,n,s;
. |8 y$ m/ T- `1 P9 {for(j=2;j<1000;j++) + O+ w! p- K# g/ g0 T4 \
{ - g, O2 f0 |- y. c; b
n=-1; ) `& m% a4 j2 N1 K5 M2 M$ k
s=j; ! [; ^# g; S$ z$ D5 o
for(i=1;i { , a% @- F+ d0 L& r8 F
if((j%i)==0) 0 m3 c& I7 a7 D1 u3 t
{ n++;   y6 s. d+ H" ~" A
s=s-i;
" p8 f# K% {0 H1 c" Fk[n]=i;
2 @$ ~! j+ }3 {+ d}
0 k8 S+ `. }1 e. f/ I}
. c5 A" h, L1 v2 C: v6 Q& }: `  qif(s==0)
: w: t6 [; _' X% ~: l" f* y6 U: e{
$ v" v2 \8 w/ H$ G$ z8 }printf("%d is a wanshu",j); / d& X( o/ {7 Q5 W8 C% }7 y' [9 w
for(i=0;i printf("%d,",k);
: _8 o+ ]9 n( Kprintf("%d\n",k[n]);
& V# E+ \, C3 o# J% K- v; {/ Y. }6 A}
, v5 Y* L2 k1 y  a}
9 s# {6 B7 r0 Q6 ~- ]7 ~4 f8 p}
3 z9 V9 u6 b) r0 e  e( \==============================================================
) V8 g! P# [2 g/ [【程序20, y9 D3 @" ^  Q; ~
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 5 K# ?/ L( J6 k0 O) x: {6 n
10次落地时,共经过多少米?第10次反弹多高? ) @6 _* P# C" w0 A
1.程序分析:见下面注释
; C: v8 l: F6 s4 ]  \+ x2.程序源代码: ' \  P# o2 e/ t, K9 S
main() 9 |& [. S- o- T% l
{ ) M2 Q, _/ s6 w" ^# q  p
float sn=100.0,hn=sn/2;
- b( J- X  M2 f. B  r5 m) `int n; 2 B  n) o# [( j& f/ j1 _
for(n=2;n<=10;n++) ) y0 N2 C* z4 e* E
{ - P/ E' j: U2 d
sn=sn+2*hn;/*n次落地时共经过的米数*/
: \! I- V9 y6 }# f  Z" `9 s& N4 hhn=hn/2; /*n次反跳高度*/
% Q" ~! @- p' ~5 q6 c! b+ q' O}
1 r8 w+ ]7 \6 a3 C% P$ B1 cprintf("the total of road is %f\n",sn); - E% \/ R- b, U; j4 S
printf("the tenth is %f meter\n",hn);
; V) W- `9 A2 w7 x* D+ V+ K& [7 S}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个! G( L  ?* ^! d7 r
   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
8 c: N7 O% r9 \; J$ `, i/ e( T2 F/ n/ s   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。# c7 F( u6 w4 q, E& R% R* \
1.程序分析:采取逆向思维的方法,从后往前推断。
) R. _2 O6 h5 ?* Z- q4 p2.程序源代码:
! X* j  }: Q  W7 `main()( @6 J# M  L1 G
{
- i$ ~8 J6 S# Y: g! o& C3 Aint day,x1,x2;3 E, V9 f  v+ x
day=9;
( u; `* i; q2 l; tx2=1;
+ h3 `2 ]6 `8 _, awhile(day>0)+ O: V/ [3 k6 C
 {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/5 H9 r1 f. d/ P" d$ X' l
 x2=x1;
  p, `' u9 r$ E day--;7 t2 ~' t% m3 e% h& M1 y
 }
- _, n3 e3 j2 T3 i' r4 Y8 ?$ Pprintf("the total is %d\n",x1);/ z9 L  c6 ^/ p% ?6 e$ G- L! u7 L
}
; M* O/ l" [" j, ]4 h: V7 z  [==============================================================
/ C7 t# W7 G: D) q/ X- M* Z5 L# F( C【程序225 W% V# c0 s- q, ]
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定% X2 @/ r3 f! ]/ s! |1 H
   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
+ I( S. r4 H3 |, D+ a3 R   三队赛手的名单。
& {  E- v# V" o# @0 I- B- V1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,
; {$ B  w0 [8 x      则表明此数不是素数,反之是素数。       
( z4 |; e7 F0 Z; p. S5 ~- I2.程序源代码:
+ F* N/ r# P' w7 p) P! cmain()
, C$ j& c. z6 I, D" y$ h  c2 X6 j{6 W: t, v4 j& O1 ?
char i,j,k;/*ia的对手,jb的对手,kc的对手*/. w/ R0 n& w& V( j. w
for(i='x';i<='z';i++)) k8 B- n4 s9 A% K9 }* l
 for(j='x';j<='z';j++)
' P+ ~, d/ B. v& k  P6 w- _ {2 e* X! M. S& ~; P' V6 ?
 if(i!=j)
6 G- Q+ ^: }3 a% I  for(k='x';k<='z';k++); M2 C1 t5 b, f1 V- ?
  { if(i!=k&&j!=k): I  U1 d" E! X  k: W
   { if(i!='x'&&k!='x'&&k!='z')0 L- d- t/ n% d
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
% U; |, s3 j6 X$ ~. g   }
% i" E# G- X: v  }) l* R$ V. `8 ^; E6 z- M; a
 }
# ?) ~# Q/ ^1 g/ f0 {0 h}* D( J( S( L# Y' R% H" f# C, |; S4 V
==============================================================; Z8 V" a6 T# G. k* x& G$ _( c
【程序23
; L6 P( K4 C3 h3 O$ S( I" }题目:打印出如下图案(菱形)
*
, Q0 o* K  [* K. H- R***
- P3 C) X( d7 ?: O* G! _: Y******
2 C+ P" U0 P- B: B********+ G& D( y7 C! v. g, j
******
% q# A2 g( r6 v& U***% U' |4 e# E, Z0 x
*
  H$ X) G3 I0 Y  x1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重: z0 ^0 w4 f5 G5 V
      for循环,第一层控制行,第二层控制列。 ( K" a& f' f+ m& R
2.程序源代码:% g. T. _# o, m5 O7 R3 |1 B: T
main()
' t2 n, W- m1 I{/ x$ `1 @' O5 G* I( {5 q* z3 m) j
int i,j,k;
. ^7 f1 h) H7 _6 {; h  afor(i=0;i<=3;i++)3 }5 g: W  a& z* G5 K
 {' e$ M- r' p8 b0 r5 s! B7 V
 for(j=0;j<=2-i;j++)
" k1 d" d3 @0 O' ]8 R( S  printf(" ");
4 |; ]7 t5 O9 \6 b  I' w9 A& z+ k1 M for(k=0;k<=2*i;k++)
! u8 a7 J: U, E  printf("*");
8 z6 h! B, h" \ printf("\n");0 U( h3 z5 u7 r
 }- [7 o& w' J( `5 q
for(i=0;i<=2;i++)" l) ]4 [5 k) C, {
 {/ y4 a: u* s. ~& I
 for(j=0;j<=i;j++)- A% r$ R0 k8 r3 A$ w7 |
  printf(" ");
, ~% g. h8 `+ ]; z for(k=0;k<=4-2*i;k++)$ u: c+ X' G* c- A* \7 r; k
  printf("*");2 Q5 s# {; ^% @: {( @
 printf("\n");$ ~- c& g4 x1 a9 F! Y( ^
 }; O" R  p) J  |2 m% u) S8 b
}
, Z5 _9 d6 O: R# |  c. Y2 {==============================================================; Q8 q* u: p+ {; F  b/ T0 i3 [  a
【程序24$ q7 s" x8 M; c. w8 o2 p
题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
; O1 r6 d1 i* j# s1.程序分析:请抓住分子与分母的变化规律。
% q' i, p# {- Q+ \2.程序源代码:
" [5 G- G% C- O0 {+ Qmain()
. h; g: g  n2 R7 b; t+ @: i5 e  N{9 [# q. Y- ^" W' E. i
int n,t,number=20;
  r- o7 ]5 {" j  c" R4 N# v$ Qfloat a=2,b=1,s=0;; e3 l9 Z* u% ]  [3 r4 |4 e
for(n=1;n<=number;n++)
0 @; y4 X9 b+ c9 }6 n% ]2 K {
$ Y2 G, P1 f, @& w& v s=s+a/b;5 t/ u& _# c: h
 t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/# a# w  z4 f) S
 }
( w1 L3 f  z4 V, vprintf("sum is %9.6f\n",s);
- a/ S: u& {4 r% n* t* d  E}
9 ~8 r1 _) t( e2 k2 p5 d==============================================================% A  J6 Y# X( b. J- z  W
【程序25嵌入式学习企鹅要妖气呜呜吧久零就要' n" B) a1 u1 j& F, k9 F9 n
题目:求1+2!+3!+...+20!的和
9 w( h% _1 v2 o3 }  _1.程序分析:此程序只是把累加变成了累乘。
& h0 \5 J- Z  S4 |% ^2.程序源代码:
" R! q8 [7 S8 \$ t2 U; N; Emain()
, b8 {' F% Z! q; ?& k{$ N) N/ B5 `7 P5 l- w& U, [
float n,s=0,t=1;
& L4 }5 Z3 k( [0 yfor(n=1;n<=20;n++)3 p. g) P) I* i3 [$ t$ B: `7 \
 {1 P  z' h) B* O: B' @0 L. ?4 G
 t*=n;& J+ _+ U6 {- }1 v5 _* S# T
 s+=t;& |6 s* L: _1 h% c
 }
, K; S/ M% ?* x0 V4 eprintf("1+2!+3!...+20!=%e\n",s);' [& ?: G% I+ Z+ q1 C1 U
}
* ^' @. M3 d5 U/ i0 z3 Z, m==============================================================
& c  }. {! }" F% F, i" ^【程序26
8 v2 ]. H  v$ E2 P5 {题目:利用递归方法求5!0 |. J4 g* i7 n
1.程序分析:递归公式:fn=fn_1*4!
1 T4 R0 Q$ q- r8 B0 P5 r2.程序源代码:
# D) v& Z: N- `$ v, ?2 w#include "stdio.h"
! e3 N0 Q; e+ `4 O# hmain(): _: A& [! o9 o4 C9 g  u
{
/ c6 [5 X( v, Eint i;, R7 }. Y# y3 x4 r- d4 \
int fact();, S; m% [3 c5 k6 n; o
for(i=0;i<5;i++)
3 c) @$ G1 D* p2 C printf("\40:%d!=%d\n",i,fact(i));
+ F5 z3 D: d- T0 [% d}1 ]4 Y8 C( p% z9 h  ~- C
int fact(j)
* Z- z4 D# n! {3 i3 V4 mint j;7 Y5 `9 m( c' [5 b! z' Y
{
1 v( K- p7 X! W: U: l& X3 D! l/ M% sint sum;. h8 R' e* o6 G6 I/ k( @
if(j==0)
$ h; A% Q9 O7 R! g9 L& g2 y sum=1;; w! A: b9 p9 _. T0 T
else
. ~# @5 T: x' m0 j; z+ O# J8 A sum=j*fact(j-1);
1 h/ O, H  l' p4 creturn sum;
6 [4 |4 ~+ e! G( x- O2 S}# s' I: Y  {0 b, Y. o
==============================================================
! Q# }% l2 l) Z% K' X* n1 [' \. [, Z2 W
回复

使用道具 举报

发表于 2017-10-9 21:23:19 | 显示全部楼层
学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-4-25 19:18 , Processed in 0.054019 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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