机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2786|回复: 1
打印 上一主题 下一主题

C语言算法16-26

[复制链接]
跳转到指定楼层
1#
发表于 2017-10-6 15:41:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【程序16
3 w1 t1 i5 m9 a% D5 y题目:输入两个正整数mn,求其最大公约数和最小公倍数。 % I0 O; B9 R- C: l& l9 w2 `! u

( J/ A7 G/ ], G9 [; I3 k  T+ C$ g- I- n# F/ }
( L1 Q& h3 q/ M- b# N3 ~
作者: zhlei81 2005-1-22 11:30 回复此发言 . f% x3 d( n0 f

# R0 K2 t- K% ?$ D9 ]7 V( L-------------------------------------------------------------------------------- , F7 K7 I/ U3 Z

* l  I; `. K  t/ V; r; u4 回复:经典C源程序100
; v( n0 i( V5 R8 s- w1.程序分析:利用辗除法。
8 M5 y) r: e: o7 s! B- {% X
& [1 X) l$ ]( _8 V- u* b, n5 B: P5 H2.程序源代码:
% q: R4 s  }5 Q$ T" r: T: Rmain()
) T( {1 _$ S8 G" |" n/ Y{
; A5 C, ~; {& g' {int a,b,num1,num2,temp;
0 K5 C4 r5 O7 t$ q8 sprintf("please input two numbers:\n"); 1 k% a1 W, A( b1 \- {1 e
scanf("%d,%d",&num1,&num2);
+ x* A& J) E# L9 m& f8 J1 yif(num1 { temp=num1; , Y2 q# Q- D9 ]% V
num1=num2; ) ^3 k: i. t; p$ n
num2=temp; # X7 a6 [, J. W% M
} ! z6 }* x! X1 \/ ]9 X7 S
a=num1;b=num2; , c# L- }8 [& ^
while(b!=0)/*利用辗除法,直到b0为止*/ ( V4 M5 x. u, l4 z4 B( k
{
$ h9 s, i( t% v- D! }/ b/ gtemp=a%b; . @# ^! N7 o7 W
a=b;
1 C4 u3 H/ `! J  `1 vb=temp; / n. h4 x' Q: r' Q! W1 d3 A
} # H& K+ ^* X0 x6 v" G6 k- o6 n6 h
printf("gongyueshu:%d\n",a); 7 y$ x$ m& q/ W5 O
printf("gongbeishu:%d\n",num1*num2/a);
  c/ f: g: G; C# M1 O  Z} 4 G. \& X3 Q1 Z6 n7 V' p) X
============================================================== , K3 a0 D- G$ m
【程序17
7 Z- O3 d$ s4 W  c9 o4 [* Y题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
0 O" U9 W% G* M1.程序分析:利用while语句,条件为输入的字符不为'\n'.
0 I; a2 D4 T; f" \' F+ b0 q# P; {1 }+ h5 Z2 D5 s; q' l
2.程序源代码:
8 D0 f" W9 `5 O) v" a; D#include "stdio.h" # w: a  ]- \$ B; K
main() * W7 x9 A9 }# J* Y7 @
{char c; 9 l7 j( Z% N% E  Q/ q
int letters=0,space=0,digit=0,others=0;
- U7 Z0 ?; j7 V! g$ w. X, y% Yprintf("please input some characters\n");
7 ~( F/ u$ s2 s$ iwhile((c=getchar())!='\n')
( e% V2 x: y4 ?" [- y& k! x, e{ ( |  U) W8 A5 n! K: P- L( }7 }
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
5 s- G3 p7 H7 \  u- \, aletters++; 9 c3 p7 ^' }( a. q! s# @! B
else if(c==' ') 7 u/ U0 d' X" h" w
space++;   p" S: ^, U. m" a$ s( H
else if(c>='0'&&c<='9')
# {+ c5 V% @9 `4 J; sdigit++;
- m9 D9 F' H) a% |5 c, U1 pelse " O$ O) ^9 u2 n1 j9 o- ~' V* a
others++; ! Q. x* X; |0 u, `2 b
}
4 P: B) ?( h+ `: f2 }9 Kprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters, ' Z" b) R) I/ E' g3 W7 ^+ G9 B5 i# k) {
space,digit,others);
8 K* Z: j/ ]1 A- ~}
) d4 R3 ~$ w% f3 R# \==============================================================
* F; C) K1 `) V+ ~, B; B5 Y0 v7 T【程序187 o9 e9 K( j+ d8 p4 ^
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
# F+ T5 O$ X( q  f9 U0 Y; C共有5个数相加),几个数相加有键盘控制。 + o4 _# ~; n& }, A2 v$ _
1.程序分析:关键是计算出每一项的值。
# e4 u, F9 o2 D2.程序源代码:
3 Q* l. m8 J+ S! R) ^main() 0 _% I! z' s& R) X* R
{ - w& w, D8 [/ j
int a,n,count=1;
3 Q* j6 X5 w; q8 @long int sn=0,tn=0;
. z6 }; J; C0 V- q/ r: \printf("please input a and n\n");
: w9 e: _+ S+ O; U) N  D" K9 A. U# \scanf("%d,%d",&a,&n); $ k, L2 a5 o7 j' \6 Y
printf("a=%d,n=%d\n",a,n); ' |( Q* s' y+ n. |7 @" c! b9 s5 D
while(count<=n) & o% B0 R, j8 H2 B2 b- n
{
( F3 \( ^- h4 D: f, E* g4 jtn=tn+a; " U0 W+ e; z: i, ~9 R7 m
sn=sn+tn;
4 g1 p6 d4 [+ I/ G; n( {, k1 c( v  `a=a*10;
7 c+ Z! v; h1 H) K" R++count;   U% l7 O2 C5 }1 d
} , ?; D6 _. W* M3 N0 U7 l
printf("a+aa+...=%ld\n",sn);
9 Z* ~# P" o% p8 h( h: }& L}
- u- i: ~* {4 o/ K, k$ c==============================================================
. |& k; \" I% t' ]* S7 M# b【程序190 a% ~! h! _1 h, y6 e9 J3 Z; \
题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程 & |# b; R/ T7 ~0 L2 ]! d( t+ N
找出1000以内的所有完数。 ! o( N: r& U9 u/ }
1. 程序分析:请参照程序<--上页程序14. $ X5 i9 y! |* Q- [. l3 x* X
2.程序源代码:
4 |. a9 @. F6 k8 T+ J5 ?main()
) z* u" t% B8 M. q& Y8 s8 T{ . |& m) n: m4 D
static int k[10]; " X8 w, \% S4 M* h( l
int i,j,n,s; - A! I3 Y4 x- P) L) U* c
for(j=2;j<1000;j++) * n* y# D; {& T) T7 Q8 \& n! u& ^# w7 O
{
5 L" w! S- b; L0 C2 X& Q0 Gn=-1; , V  Z- i) y2 o! c2 z* [2 N: Z
s=j; , B+ Z/ z# g! p5 T" w/ l
for(i=1;i {
( f' h& q& S) X; e! ~if((j%i)==0)
5 X- A* g: E) x, k! d+ }$ w  o3 I{ n++; , c& Q; |: }' a6 `6 Q1 w: @
s=s-i; ! ]9 {# m4 V; E: k) }! D" y7 G
k[n]=i;
2 V$ |+ a: J/ c. f; w6 F0 d} 9 A7 r0 r3 p2 f: p
}
. b  {+ w% K* `$ G' J0 Eif(s==0)
8 N7 F, z3 R! S" H{
6 j6 s' r( }- |" x. v* y. ?1 ~5 R7 \printf("%d is a wanshu",j);
6 i& u' _" P4 J6 H* s& w7 Hfor(i=0;i printf("%d,",k); 9 U% c# r7 M2 o5 C
printf("%d\n",k[n]); ' @. n/ B, o, S6 y/ `
}
5 a; F# M9 n4 t5 F} 3 y- f% p7 U/ I6 \$ n; c
}
* Q, X- j( |% U; X9 i7 a, L==============================================================
; c% @5 Q: f7 q) v【程序20
) L( v3 Z) W7 y3 R( K; y题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
6 S  ]( F* X; v& Y& r4 x9 Z10次落地时,共经过多少米?第10次反弹多高? 5 S4 U; f) F! T& o4 p: H
1.程序分析:见下面注释
/ V( d; z+ F4 F( b& c2.程序源代码:
3 u6 n+ b0 u  C1 y1 W) G" Z" t" P! Bmain() ) g+ K: z( l0 G6 C
{
7 V  O& Q: w- K: H, Q7 }& _% g4 Cfloat sn=100.0,hn=sn/2;
. R, U$ {, k$ l2 w' Qint n; . u. {% T; c, @5 X' u2 T+ g
for(n=2;n<=10;n++)
$ F4 N( Y/ r$ c4 g' ]{ ' C. @8 V" R; s
sn=sn+2*hn;/*n次落地时共经过的米数*/
6 a% E4 W) Y# t; L; q' [hn=hn/2; /*n次反跳高度*/ 3 v6 U) |- `/ `# t# U7 B' a$ J
}   m; H, l* N- w4 I8 k+ C* n/ l
printf("the total of road is %f\n",sn);
  [0 }6 ?: Z; O- m2 K$ U% oprintf("the tenth is %f meter\n",hn);
& o0 ^7 r- t2 J5 a5 }}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
( I6 y+ J1 A4 E7 @% ~* z   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下6 w/ x3 `9 D- M: n
   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。+ n" [# p- e$ A' H
1.程序分析:采取逆向思维的方法,从后往前推断。1 \! x) ^5 u5 s9 @, p. c
2.程序源代码:
  e7 f/ @5 h! t6 F$ B# l' Lmain()* u, ^3 {8 k6 D+ k
{
' K" S0 k3 M+ f( q5 {! H  hint day,x1,x2;
  I8 Q% U5 A/ W) [6 Eday=9;
& \  I/ E8 f& w; l8 j  t0 Wx2=1;$ r( b0 p3 l$ X, O; J( w
while(day>0)
8 {$ @+ V# O8 I. D* |$ K1 a* C8 H {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/% D- x$ \* U+ e' J8 ?% T+ o
 x2=x1;7 l+ h; E3 J5 d( u
 day--;
. T1 D2 Y, F! C1 d1 u }
5 T6 L1 L4 z6 I" P! N' aprintf("the total is %d\n",x1);  U$ [- C+ A3 {( \7 a& U% T
}0 S) S! c* W9 ~6 \
==============================================================% V' K- L& f* K0 M4 X
【程序22
6 [  p$ ^3 a3 g: {% C1 j+ n0 K题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
0 u+ T  f# k5 a- X) P   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出. C0 ?/ _4 u3 ]
   三队赛手的名单。 1 b7 t8 a5 O$ E) `' v9 f
1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,
5 i. Q1 ]% O; I% k      则表明此数不是素数,反之是素数。       - t- A/ C8 K6 d% ^% P: ~: G1 m6 @. f
2.程序源代码:
6 P+ u3 `6 D9 u5 Amain()
. w, _. ~3 G, `. L: h, N{# p. d: ]* @. V
char i,j,k;/*ia的对手,jb的对手,kc的对手*/
  {7 g; ]3 ~: n& f# Z& K: C! {; X' qfor(i='x';i<='z';i++)
/ M& u0 j- t! z1 M8 y6 ~0 H for(j='x';j<='z';j++)
' l* ?) x: d8 T" C4 C {
+ J: w) r6 G+ S5 I, V if(i!=j)
2 E, w+ O) Y3 d6 d" H7 C( |  for(k='x';k<='z';k++)
8 x4 Z/ T  t- F1 j. h  { if(i!=k&&j!=k)' G6 `$ z8 @0 h1 {' f# G
   { if(i!='x'&&k!='x'&&k!='z')3 e: C. k) d. E1 Q1 ]6 H: W
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
. u' T( b1 O+ s) b3 T! a8 E# Q( D! ]' N   }% F: y8 P! |1 ~  _- Y
  }
2 Q8 a4 T1 R6 C& x }
1 O3 L9 u8 ]/ s  }$ l2 Z}% W" K) q, X  N' D3 I( u2 H) }
==============================================================$ C( G, }' `! m6 v* }0 v
【程序23
$ f4 d  M7 ^' u题目:打印出如下图案(菱形)
*
, _: g! u$ p% }2 z/ N- l***: X$ R% ?$ V- F, W$ b7 t
******
; U4 e$ L8 u0 T1 }! t9 b********
# G6 e/ S4 B: Y/ C; G******, L  s* ~+ ]1 z5 |+ V* r
***3 D& ~( ^* I! |' O' Q& ^
*7 t8 a' r: e' k  `
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
4 |1 j4 f3 O! x8 Q$ w5 [7 @      for循环,第一层控制行,第二层控制列。 $ }7 J1 n; c6 X. j- x9 E2 a! ?
2.程序源代码:1 B1 \0 z0 O3 {$ N; ]1 e
main()
% ^0 p1 w$ M3 G5 ?; b{6 n& j' c: y( b, U- B* `2 T
int i,j,k;1 o: C( k/ K+ L0 |$ o+ X
for(i=0;i<=3;i++)
; o! w2 y$ @. @" r- O {
  _0 {* m, J. F6 S9 g$ S for(j=0;j<=2-i;j++)6 h; X3 I' W. w. s' T
  printf(" ");
7 _  \6 O- p# Q. b for(k=0;k<=2*i;k++)7 R5 g0 k' l2 s3 m1 h* Y1 e
  printf("*");
6 b8 e  T7 V" t  {$ f printf("\n");: S9 K0 @4 p( a0 B; F% r9 j( e
 }
8 c. D" Z# p+ Z; W* x+ ^* Q, ^0 Pfor(i=0;i<=2;i++)
" n- {' ^5 {5 _; q/ d* [; J/ y {
8 Y, p# W" f+ } for(j=0;j<=i;j++)
4 F/ J' o- l" j; j  printf(" ");& Q: T, ~1 J, p7 {6 i! d
 for(k=0;k<=4-2*i;k++)2 `6 O4 d  Y( ^: {! X) [$ _
  printf("*");) x$ z6 G) p+ x( h& s2 a1 t9 _3 ^. y
 printf("\n");1 i/ R7 y& v3 n# `
 }: d6 R3 B" g" A( L
}
- p: R. q$ M. y0 [5 ^, t% m8 m==============================================================# p9 u9 i6 C. Y4 }& o
【程序24. C+ |* G& s1 Z
题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
$ O: k, X! |# j. p1.程序分析:请抓住分子与分母的变化规律。 4 }9 B* ?8 O2 b# g' {- f: K$ W
2.程序源代码:
& v: W' p# l% M! C/ Tmain()
& m+ o6 k& M2 U{1 U- X' h* e2 I4 Q* @" u
int n,t,number=20;
* H: j# F: ^: `, S3 b/ Hfloat a=2,b=1,s=0;' p$ p$ l  Z: n( s, q2 U0 Y
for(n=1;n<=number;n++)
. h. B1 Z& n9 p& i {
6 g; j  ?. J* i s=s+a/b;, y: `$ c9 k& @' d
 t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
/ P' K6 C6 f% ^# A7 w }1 O# @0 H9 u, F' I0 C
printf("sum is %9.6f\n",s);) Y% F7 b' O/ m, _
}, h, O5 P( |7 ^! w* g
==============================================================9 G$ C* ]2 ]/ k8 }" ]
【程序25嵌入式学习企鹅要妖气呜呜吧久零就要
! [- @6 K: n) e" D题目:求1+2!+3!+...+20!的和, X$ a; o# g4 G; U
1.程序分析:此程序只是把累加变成了累乘。
- ^. b2 {$ C9 E6 y7 t$ _: V  B2.程序源代码:, v* _' j$ H) n; i
main()
3 l$ o: D+ K% v3 o: i{, Q6 D3 k9 Y; K# O" g
float n,s=0,t=1;
! _8 f2 b7 N& W* n2 Ufor(n=1;n<=20;n++)/ @' X+ P7 K( Q- C
 {
( C+ [# S" O; P t*=n;
3 j$ d( O, M) d4 Q( e2 m s+=t;
9 t/ a) R+ b* S& I, T: [ }7 w# _0 |. c; ^0 Z- L% ?* e
printf("1+2!+3!...+20!=%e\n",s);
% G( \' C% Q( S( X, l$ w+ J}8 F0 {" G  U) [& A" \
==============================================================
% U* ]7 ^$ B8 G% Y* i3 B' M. @【程序26
% Q7 A9 S0 f8 U1 i- `7 o! i题目:利用递归方法求5!5 J! }' g" n* k! K1 H
1.程序分析:递归公式:fn=fn_1*4!
2 M! S# S- |  M/ z9 M7 [; N: b2.程序源代码:
& @/ N4 \* @4 N7 ^- }#include "stdio.h"7 @+ Y& y% \" C9 Z5 p
main()" H! U; Z, u% C: q; i
{0 R( W7 [5 I6 I# ~8 W% c2 z8 Z6 h
int i;- W2 k9 V; T5 Y$ l, W" {2 X
int fact();
8 L- |! l& p) Mfor(i=0;i<5;i++)$ L4 ?; B2 f9 E1 y7 F  o) y- Y8 A
 printf("\40:%d!=%d\n",i,fact(i));
* \+ Y6 n5 \; [}- v* K, [4 B9 g) i; y8 V7 F! E
int fact(j)
: ^) M1 j5 g/ F5 R4 r1 zint j;. x( ]% E( o! O2 ?/ `% _
{
1 ~% U2 p3 x9 F& m+ @9 w/ x! `2 A7 uint sum;
7 j+ H; v$ A9 c' rif(j==0)3 y4 `+ _* [2 d
 sum=1;
) X& R% u+ C0 U  E  Welse" f) K! e* X0 e! t9 w
 sum=j*fact(j-1);
8 K! ~( d' v) h/ j" c; preturn sum;
9 t, Z6 X5 }  L5 a! t8 ]}% D5 i+ e) f3 G. ^- V5 T
==============================================================
0 n* k8 _+ l' R/ S8 Q  T! s
回复

使用道具 举报

2#
发表于 2017-10-9 21:23:19 | 只看该作者
学习了
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-12-24 22:16 , Processed in 0.050402 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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