机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

C语言算法16-26

[复制链接]
跳转到指定楼层
1#
发表于 2017-10-6 15:41:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【程序16
# h! K" {( O7 S% K; {% \- {题目:输入两个正整数mn,求其最大公约数和最小公倍数。 ' v! m8 D/ Q' y% V' n0 T" |' I
, x5 h  |' e, C! S. d! c

" _3 X3 F/ G' u7 Z( h, n7 H( s2 _
. Z7 Z5 w) |" w  Q# h作者: zhlei81 2005-1-22 11:30 回复此发言 1 h) b. Q- y- M* Z  M6 U
* b8 \! o1 C# {8 @" C8 f
--------------------------------------------------------------------------------
" ]1 [- h) y$ S8 o. {
1 ^7 Y( D: D4 O8 H6 n: H3 ?8 f% W, Y4 回复:经典C源程序100
9 Y- g6 W, v& V, {2 ?1.程序分析:利用辗除法。
3 _; m1 S4 W* T7 h" r7 Z' r- G+ s" [  Q& Q( }. ?: W  `
2.程序源代码: 1 `, ?; G0 z# v# U/ A# L
main()
( x1 l) [3 e9 f# ^- o1 m5 ^8 B{
7 b% U" ]( a1 S& a* Gint a,b,num1,num2,temp; 7 L& w" W, ]/ C% \8 D( _
printf("please input two numbers:\n");
+ V4 M% ~* D% ^% R  Escanf("%d,%d",&num1,&num2); 1 o! O  b5 z) I  t1 {. O) n
if(num1 { temp=num1; 7 C' p2 w3 o/ U
num1=num2;
3 }( u  B! z) r. H1 Rnum2=temp; " I2 K  L' o7 v: h9 R: n. D6 j& b
} : t, E+ v0 B" U$ j; }- d% p2 J* ^5 p
a=num1;b=num2; % t% v# x' a* s3 M) f; X$ ^
while(b!=0)/*利用辗除法,直到b0为止*/ ' e3 }4 e' Y+ K+ N4 e
{
7 L# [+ H/ g- G" [# Jtemp=a%b; " u- K, k  a) a& f
a=b;
% d0 Z: e0 g: `- P( G/ Z3 {b=temp;
, q! c' [% K- Z5 {. `} 1 O) ^# [' N. G$ P& e
printf("gongyueshu:%d\n",a); " q, j5 m! ~0 |  c+ Z, v2 c$ B
printf("gongbeishu:%d\n",num1*num2/a); 0 k( ]6 e6 @% R8 y5 o
}
0 V$ O2 ?* `# w==============================================================
6 c$ K9 ~5 f* U8 P: s" F【程序17' ^: Z7 @+ y2 U+ E0 G
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
) g" I& y, S* V8 K7 D1.程序分析:利用while语句,条件为输入的字符不为'\n'.
1 V" V7 D6 M  F" H% w, h1 k, s8 A$ k
2.程序源代码: % @7 r& u( e5 X( G5 Q( I
#include "stdio.h" 0 G/ h% ?2 {1 \3 t! v9 l6 ^: C
main()
" K. ^/ `3 u7 ^& t' |{char c;
0 q8 J! s. _4 Eint letters=0,space=0,digit=0,others=0;
# H/ {. H6 s# }5 d8 F! `  aprintf("please input some characters\n");
( ?; @" d9 g7 {. u3 Hwhile((c=getchar())!='\n')
* X3 o. G+ x4 M4 |0 }1 E  m{ 3 y# a0 b" \. a0 I- O& _# D1 {
if(c>='a'&&c<='z'||c>='A'&&c<='Z')   G3 f% ?  s1 y( r/ u" O- S3 n
letters++;
' E9 e% f' D; i6 e; X( \+ aelse if(c==' ')
& ?1 N, f1 R) ~. {$ Nspace++; - c  O, ~- b- @" h1 x+ P* Y3 ~
else if(c>='0'&&c<='9')
3 x' \$ ]" N" ?. p% \+ d6 \5 Mdigit++;
( N6 S& H/ K+ _' }3 Melse
, |( l; N+ J- w3 G/ x: H6 jothers++;
: V! I7 z1 K: r7 b6 }, S} 0 I8 n9 ~  R5 M" o4 \8 {) Q( S
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
) o5 n% a. T  fspace,digit,others); 5 T& C7 r" c6 b; [3 J" z  \
}
/ Q, t- A7 ^& z6 U6 N============================================================== $ R1 ^# Y3 y" I
【程序18* z; q2 ]8 ^; S3 w. o( T& L; P
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
* r( M6 ]8 [5 R8 A/ A! Z; K; z6 K共有5个数相加),几个数相加有键盘控制。
9 c4 C/ m6 R& z! b% Q$ ]0 N' o" ^/ M1.程序分析:关键是计算出每一项的值。
4 W9 q$ I4 S2 Z1 |" U5 D2.程序源代码: ) @' p# D8 ~6 R0 p, f; Y  |
main()
6 @4 n9 G$ S0 l, D{
0 x% q8 u5 s8 i9 Pint a,n,count=1;
' C: d6 @) W6 `4 j2 t" [; ilong int sn=0,tn=0; ) P3 I0 l, i9 X( ?* y/ ^
printf("please input a and n\n"); 3 N' i5 q3 ^, c0 M6 u: U- k
scanf("%d,%d",&a,&n);
: @# j9 l$ K3 e+ x. D7 p. y/ gprintf("a=%d,n=%d\n",a,n);
. W2 ^* c& S. Lwhile(count<=n)
9 G, p* C' ?, y3 B9 y: i{
8 ?+ k% a7 [% r- M1 Q2 O2 Ttn=tn+a; / B  A% n, |" m8 J7 n' F0 x7 I3 K
sn=sn+tn;
8 K/ Y, w: u6 g# i0 z& Ta=a*10;
8 V5 v4 e! y+ q5 Z4 s3 l! D# u: U++count; : y, {% Q, T# V1 q# e
} * T0 z* J. d8 l5 K2 H, ]
printf("a+aa+...=%ld\n",sn); & M, t' N8 O# M/ ~
} ) t" j6 e2 Q9 x; d5 V5 Q& G  P# u
==============================================================
) G1 e7 T2 L  q* x6 V+ I- o, J; N【程序19. _4 v1 X+ t- Q8 r7 E0 I# }" F
题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程
9 T% B, z$ P- q9 r8 q5 \4 s找出1000以内的所有完数。 - k5 z' e& d( }# f2 \
1. 程序分析:请参照程序<--上页程序14.
9 l, S0 ^/ m& s9 O0 |2.程序源代码:
6 m# S' g" ~) `  ]7 E* w) F& D3 dmain() / f) \7 y; _( ~/ I( @' P
{ ) W) I1 [+ {, P
static int k[10];   r+ y1 ^% P5 j& B# _$ Y
int i,j,n,s; - K5 }) c0 q3 G) E; Z
for(j=2;j<1000;j++)
4 K, ~7 P2 v5 x* Q{
( Y1 h2 _2 @. I- z4 sn=-1;
' J) d& w9 r, C( e  H+ ]s=j;
9 h2 N& G* P, X& Efor(i=1;i { % c& E4 q, t( r! X
if((j%i)==0)
; z8 M* p6 x/ O2 X4 \0 _3 F+ M+ _{ n++; " K( B; c) q& l
s=s-i;
' p) l2 A6 ]9 V/ zk[n]=i;
; |5 }5 v; ^4 @4 D3 s- h}
1 j& }' }4 m) R' h1 ~' ?( R# O/ E1 `}
( |4 D! p! ^5 G5 _# i+ h# ~7 f! L# Eif(s==0) % y3 u, ?( V7 ^! y6 `
{
4 J3 w5 E; H8 J: w* tprintf("%d is a wanshu",j);
3 y% z" l  W6 }+ xfor(i=0;i printf("%d,",k);
- s* O8 B' {& i; f6 O0 u# q5 aprintf("%d\n",k[n]);
' Y: S8 R) _: {# Z. D} " l; e& h/ x0 Z9 }5 ~8 z7 S, k
}
0 V! m, h! j; U}
# f" E) ~5 n+ z# x, W( L. i* H==============================================================
% g  g3 Q$ i) @" h* X" a0 b【程序20
, ^$ e/ ?% t" A& b% d+ p; A题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 " w8 ?0 E' ?7 c# l5 s
10次落地时,共经过多少米?第10次反弹多高?
9 `6 f" X+ @! m; Q& e$ E, x1.程序分析:见下面注释
  w, `5 p) e4 U, t+ Z7 n  F6 E: ~2.程序源代码: % R0 a# M# w( I/ Q2 R: s( G, `
main()
! G  ~" G7 U/ e$ j+ y# e5 e9 f5 d{ & j" n1 x3 t6 ^% B$ a) b# \5 v
float sn=100.0,hn=sn/2; : o, ?1 \  \$ X* w
int n;
7 _3 G' j2 M% C2 d7 kfor(n=2;n<=10;n++)
* s& g: w0 y, t{ 5 {8 j0 Z/ O  X+ F
sn=sn+2*hn;/*n次落地时共经过的米数*/ 6 f, h8 `4 ^0 q8 |) t& Z+ |
hn=hn/2; /*n次反跳高度*/ 0 D/ Z' i( O8 I+ t
}
; n& U  p6 M& ~8 y. J9 Pprintf("the total of road is %f\n",sn);
8 ]9 w1 o: ~7 n& a$ x" oprintf("the tenth is %f meter\n",hn); 7 M' k# Y, A/ `4 N5 a
}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个" {& o- h7 k( N* O& u4 B
   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
7 d8 N6 }4 I* H; S7 `   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
  |0 O. ~! x0 z. z1.程序分析:采取逆向思维的方法,从后往前推断。
, f# m) G/ v/ W" s2.程序源代码:
% {) ?5 h) @* B5 _* }1 u! [main()$ D, U! E8 a$ v) {4 N
{4 L! e7 r/ [& p
int day,x1,x2;
' C) T2 O: E% Vday=9;
' o/ A6 B/ C) _3 ?, V9 wx2=1;
- S1 I; Y: l6 z! z5 k' e$ dwhile(day>0)
0 u, r. ~2 I" L# k {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/* W# l7 {! H2 H* ^' o, h
 x2=x1;- E2 C, N3 y/ [; _
 day--;. Y8 h( w" ]1 i) h. \5 ]( C# i% ^7 i2 ~
 }2 F0 `' k( p' e( O1 A
printf("the total is %d\n",x1);
" D0 Q7 |) o# X7 x' W9 X5 k7 e6 O$ u+ y}& r6 p+ B4 ^8 n, x6 _
==============================================================
) L0 n1 E" [: |$ B【程序22
9 z% A1 S2 w- C/ N题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
3 p* ?2 p7 n1 F, e, g* a# {4 m   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出5 c; s6 R/ l5 g0 q- O! o
   三队赛手的名单。
$ Q# M3 \" V; k: m( ]$ P: N8 O1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,2 \8 i- d; p; b' }4 S/ \& }
      则表明此数不是素数,反之是素数。       $ ]" s& Z* c- I3 i+ \
2.程序源代码:( r5 a) r: n6 |  I
main()& m0 }2 j) G! G& n0 x* W
{
+ o. s5 D3 f; @# u" pchar i,j,k;/*ia的对手,jb的对手,kc的对手*/5 n# C/ g8 a1 p! l3 m4 y
for(i='x';i<='z';i++)
) N1 j$ k: f, ]2 b: B for(j='x';j<='z';j++)4 S% f+ T% p( ~" X5 J2 {% m# e
 {/ ^, g- S; C: x( Y6 l
 if(i!=j)
" R6 D, n# N9 H+ _* Z4 t" `, n2 J  for(k='x';k<='z';k++)
6 r/ T$ F" ~. K) H  P  { if(i!=k&&j!=k)- R& K# y: e" r; z
   { if(i!='x'&&k!='x'&&k!='z')+ U& x5 [9 b( m' {
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);- E2 F" B! @, {
   }
- {* N( o1 m( Z" J( `  }
! c5 e9 e& u. I4 x }3 w4 q4 {* i3 k7 I7 q, r- K8 F  I
}
7 p8 x6 N3 y% l; @; h% Q==============================================================! x& \4 t$ t% }# h* _
【程序23
+ Z/ _3 j% y2 g题目:打印出如下图案(菱形)
*
4 [2 {, ?5 @$ I) R' n! C( S! V) x***
4 V# p( M8 g+ I8 q0 W# R& b5 b! ^( U******
4 ~( p( d2 N  ~7 e: b********
  x* K' \( Z  ]) A: Z( [& g& J( [' [4 F******
( C' G3 G8 w0 q" P3 K0 h( K***
, D: f- g( @; b; {2 T) G*' E" ]) Q6 x! O' @6 t2 ~8 K
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
* [2 h5 i' J" S% |# |/ V  |      for循环,第一层控制行,第二层控制列。 ; s% D3 j1 {/ c% {& a# l) S5 C
2.程序源代码:6 G( a) K9 Y  j
main()5 y1 J/ p( Z% w* }$ |. [
{
+ S1 L! J1 j% V: E% o5 jint i,j,k;  W% ^6 [6 p; c6 c, m7 p1 o
for(i=0;i<=3;i++)- Z" A, v! x  S/ k8 T) c
 {1 n0 P/ K1 v; Z( p$ ^# p& M% B
 for(j=0;j<=2-i;j++)) p3 x9 w  T2 s) F3 n
  printf(" ");
0 T) t* R1 `; D% M0 x% }  | for(k=0;k<=2*i;k++)
2 q5 A/ d. v" s) w: ~, w/ e0 k  printf("*");
: y+ y# s9 t  w( F0 y* g0 n printf("\n");
# g1 w# e9 K( j2 Y: E }! L0 w, `% o. o5 f
for(i=0;i<=2;i++)
: ?9 [1 N- F" O2 Q7 b! M {
$ Y8 X! _' O- X9 s6 j for(j=0;j<=i;j++)+ ]  ]0 ]4 r6 j0 \5 y  A% J
  printf(" ");- O) Y- C+ d, ?/ [  H; e1 B
 for(k=0;k<=4-2*i;k++)
+ q* o# D; Q" E9 B* G( D  printf("*");2 I& B$ f: C! P% j, {) Z
 printf("\n");% h0 P* z" s8 P' t+ ?7 X
 }; Z$ E; Q7 Q3 T
}
  D% ?4 A+ x: b. K8 y3 x==============================================================
) \) S0 S- z6 I- s- [% ^1 @【程序24
* ]1 Q* y1 D6 H2 l5 B. w题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
2 J1 {6 W' `( r" M3 k& \, J1.程序分析:请抓住分子与分母的变化规律。 # }3 b& g- z$ ?+ [
2.程序源代码:
2 ?) E( Z' H6 f' E( l$ ?main()
" p+ j" Z  z4 i5 ~1 Y; A{
( l( t* g' j% G% {int n,t,number=20;3 T  u- M6 n& H* d, l# A  G
float a=2,b=1,s=0;
7 g+ g* l! G, R3 a2 cfor(n=1;n<=number;n++)( z  H+ {9 M9 q3 P
 {  ^% W' c0 i0 L9 C
 s=s+a/b;
; D0 N6 `7 v4 x* O! y t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
( ~4 h( Z5 m! y6 q. |; }6 ]: B }+ d# ~# S; k* H+ t* R) e; l( P
printf("sum is %9.6f\n",s);
" @5 d2 N% U; F: E+ ^}
9 `6 R* |+ p* N==============================================================6 V3 q5 L) S4 t% O8 A
【程序25嵌入式学习企鹅要妖气呜呜吧久零就要6 O+ F5 Y# `! m: \$ v5 X% R) d1 {7 g( ?
题目:求1+2!+3!+...+20!的和/ D: M) [" P' I! ?9 I
1.程序分析:此程序只是把累加变成了累乘。
+ g) J  A0 P% J0 C' q9 ^, T2.程序源代码:
/ O$ L. ~* v5 i- b1 [7 Vmain()4 ?( M$ ?0 ?0 ?2 g% i# U8 T
{# f6 c% h! f' ^3 x* Q
float n,s=0,t=1;
3 ~/ Y3 m0 v' @# f. Hfor(n=1;n<=20;n++)/ C" Z/ d, N$ o0 _  [
 {. w/ R& H, x7 u9 _# l) h7 u
 t*=n;- e7 {; C/ l! x
 s+=t;
0 d4 P& c2 Q, z" t* ^! H9 a }
0 B, g0 V0 t. N5 c# iprintf("1+2!+3!...+20!=%e\n",s);
/ M2 O+ M' h7 M6 Q# q: O}
/ n4 d' Q1 V; o/ l' _0 S==============================================================0 [" o4 a" h0 B* y2 h4 |8 t0 ?* [+ v0 S  N
【程序26
2 f. r7 z' [* d题目:利用递归方法求5!) Z- @; f! S0 v: {2 s! S/ \
1.程序分析:递归公式:fn=fn_1*4!5 Q6 M  C$ _! a0 m& ]  Y, p- k
2.程序源代码:7 ~+ Z5 d8 u8 P( {7 r6 f
#include "stdio.h") d5 t! a' T" `+ I. w) C
main()
6 `/ |: Q" h  ~' U7 L2 |  q{
* B% K) j4 p; V8 l0 fint i;$ W/ Z7 m! x+ B, k+ ?! ?
int fact();  c4 D. M, [8 n2 Z9 S% {
for(i=0;i<5;i++)
1 p4 j, `+ b/ Y4 A2 W" l( d7 P" [ printf("\40:%d!=%d\n",i,fact(i));) x$ C6 Y. G. n! y& K
}. g, A# H0 M3 t
int fact(j)
3 m5 W1 p# O. j1 \int j;
( Q+ k# M8 k; W- D) ^: o9 G& G{$ x0 S  j7 ~8 K5 X
int sum;9 Y5 \4 {1 M3 i2 z
if(j==0)' ^, |" M* X0 Y2 ^, h! n$ A
 sum=1;
+ j7 q3 `' N/ i. C+ y+ Uelse1 z* u5 H4 @( N% T2 Y
 sum=j*fact(j-1);- ?- r2 f, @2 ?5 j& _4 X. Z2 ~, o
return sum;7 E% X+ i+ x) H8 B5 X  t
}$ f; c! b7 M# \, ?5 [: b" U
==============================================================
& p# r$ r/ z3 ]/ d# z
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-10 04:25 , Processed in 0.051815 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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