找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3073|回复: 1

C语言算法16-26

[复制链接]
发表于 2017-10-6 15:41:14 | 显示全部楼层 |阅读模式
【程序16
$ |7 N, ~, u( z' I题目:输入两个正整数mn,求其最大公约数和最小公倍数。 ' @7 K/ r3 x, Z; E4 ]/ [
$ r4 U7 J2 X4 W8 {# `6 C" T

# Q1 ]" n0 N+ \* Q3 K" ^0 z* u! C( Z" D/ w; C
作者: zhlei81 2005-1-22 11:30 回复此发言 9 x0 F1 r0 R! I2 G

# F6 P( l6 c0 Z' m) B* f--------------------------------------------------------------------------------
- S* O5 O9 j; e8 @- }3 L: g% y+ r; l& x* @, S+ M- E
4 回复:经典C源程序100
. l. M+ T2 o. f( S. K1.程序分析:利用辗除法。
) _3 P# D7 I+ C# a# f+ K' O0 o  q# U& L6 ^
2.程序源代码: 7 E' Q" S: L0 \: Q& H' N
main() ! g$ E/ R8 t3 E# \4 d! j
{
* G7 w) K8 I; zint a,b,num1,num2,temp; ! B/ S0 O- P4 Y: Q4 d/ f9 L
printf("please input two numbers:\n");
! z7 ~1 E# U! K5 nscanf("%d,%d",&num1,&num2); ' m# N$ N  u2 A" J& E
if(num1 { temp=num1;
/ m( k9 q# @7 rnum1=num2; % b) t4 B# b# z* W
num2=temp; 2 X5 x* g. @1 c4 e
}
4 }" Q2 C& H9 H9 u1 O. e) Ka=num1;b=num2;
1 c0 b  b( e  J, hwhile(b!=0)/*利用辗除法,直到b0为止*/
' Y  Y% Y1 \( p6 u' [{
$ K: \4 h+ u. {+ ?, R6 L; G% Stemp=a%b; - E  y' N' f* X+ ?1 C
a=b;
# a: {2 n* {3 [" }0 s+ Qb=temp; ( I7 S0 L. O' i6 G3 `1 h3 z  V8 z
} 9 t( `* b- Y- M, O
printf("gongyueshu:%d\n",a); ' E! J9 c( \: k! T3 Y
printf("gongbeishu:%d\n",num1*num2/a); ) I6 M/ T) ^1 `6 J: l
} ! p" v& S: u) o1 L8 S9 k- S( [
============================================================== / ]. k) X2 p, k* j0 k& ?
【程序17
$ a4 c. z6 P1 x: N8 n题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
4 N5 Z7 h% R! k7 ]) q1.程序分析:利用while语句,条件为输入的字符不为'\n'.   X, m1 h5 K+ l) _
2 m" B1 L# a+ ]/ d+ M
2.程序源代码:
# U/ V1 f0 S1 E' k  ?' }#include "stdio.h" - C. y9 ~: d2 a6 @8 _2 l
main()
  n% c4 X/ K- ?" \3 b) f{char c; ; I, f/ x% j: b2 V& f3 C7 G3 u
int letters=0,space=0,digit=0,others=0;
+ a+ G4 V/ ~7 `8 x  Z, N- r/ Fprintf("please input some characters\n");
% |+ u* @9 w/ vwhile((c=getchar())!='\n') 7 ~7 B0 ^# G' M
{ ' j$ D( a; Z* Q& B* n6 p7 B
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
5 ~. d1 S2 z7 n8 Eletters++;
1 m$ c2 |" u9 V& Zelse if(c==' ')
% @# A( ~) K3 g! [- d0 ]6 P* @space++;
2 g" \$ b2 ^# z0 _  F0 M8 E* ~! [8 W7 [else if(c>='0'&&c<='9')
8 q9 B: H+ _' q, f* g( P3 k- rdigit++; ( @" W7 a" g" X. o
else & Z" U0 n  H; S* F/ z' h
others++; ) C5 c" }5 o% b3 A5 b8 j
} , _3 M  d7 d  k$ V
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 3 y/ M7 q& A5 H/ J1 ^
space,digit,others); + {; R; C. |3 _$ S2 O# w
}
7 Z1 Y3 F& }: k) Z; k==============================================================
/ \- K3 R5 F; M3 g  S【程序18
$ j1 U! s' d) Z& |. ^" Y* M题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
8 q, a* U0 ?) P' u. v共有5个数相加),几个数相加有键盘控制。 ' c! L5 |+ W" X% k! i, `
1.程序分析:关键是计算出每一项的值。
$ A4 T3 M  s  ]- y  z2.程序源代码:
2 O; d( L8 T, A$ r- C" F- ~main()
/ \6 Y5 V* @7 ~7 w. B{
, Q) N  q; }& t6 Z% n" B/ Z5 Uint a,n,count=1;
3 k$ \" N, a6 A1 [long int sn=0,tn=0;
6 ]- t7 L* g1 |: _# y) F+ kprintf("please input a and n\n");
5 x( b4 b( X, i& H: c- d2 h! v. v/ ~scanf("%d,%d",&a,&n);
, W9 T4 M# O4 ]& h8 O* J2 b5 ]printf("a=%d,n=%d\n",a,n);
$ r1 z3 m" L" U# y2 _) h' Q3 ywhile(count<=n) ! f/ ]! ^# [" {5 T
{
. m0 W4 ^$ T+ v3 \' X4 C0 b( B( Utn=tn+a;
9 q6 l7 \$ F5 W5 Ksn=sn+tn;
- q' t4 ~# a: X* K( Ga=a*10;
( G& J# }! x  S++count;
0 I9 g3 X8 R6 O" }}
! l4 z; A. I) j. v3 @printf("a+aa+...=%ld\n",sn); 4 |0 ]1 D% }7 i: ~
}
( w$ ?& e# T% ?) J============================================================== & \7 }) ]2 V# m& O
【程序19
, U+ l6 {" m+ @. N( a  ], E+ A题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程 & v2 b* E$ d7 m4 }! g! I- w
找出1000以内的所有完数。 4 C  Z* p- N6 ^( }3 S
1. 程序分析:请参照程序<--上页程序14. ) o, E6 ~& @0 }% X" |9 `
2.程序源代码:
, }3 Z2 e3 t# S: Y7 Omain()
' J4 ~' K/ r3 {; o/ i* {: W{ 8 M2 _$ o& d/ b( D( A
static int k[10];
) U5 G1 s4 z# d; u: U: S# C5 hint i,j,n,s; ) k. Z& g7 T5 n& `" C7 H
for(j=2;j<1000;j++) 5 b. |6 o. Y/ x3 t" u2 o  m8 e
{
$ c' f3 f2 Q- h+ |2 S* vn=-1;
. `4 p. d6 k- d" hs=j; " b& m1 a* r  u
for(i=1;i {
8 X! Q4 N# s6 N5 f7 l# ]if((j%i)==0)
  k7 b3 G# u2 Q1 ~{ n++; 3 N4 L1 O; C9 E
s=s-i; # K2 o' x6 F* @' I  C' G0 G
k[n]=i;   }3 p1 z& l9 B2 m8 L& k' ~: x2 E8 W
}
( O, g# H' v! n( I1 M8 L}
9 y$ ]4 p- M: F7 y7 E( rif(s==0) 8 P. O3 o. C5 J7 \4 M1 N8 }" Y
{ & G/ }+ n  ~, i% I; B
printf("%d is a wanshu",j);
/ e+ b! t2 d. Efor(i=0;i printf("%d,",k); ! m  j9 y- j) d4 x6 W- Z+ M
printf("%d\n",k[n]); 1 z' Y. X4 R+ S, C  s# R/ O
} " K9 O8 H2 X) Y* u% w
} 3 A! d5 g! K" O! z5 P1 l
}
+ p, B8 h/ F& A/ o5 x============================================================== * u* G. t/ I" y3 N) l) {# D! @
【程序20
# S' h2 `0 T: ~8 d8 L+ H题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
- b0 [1 g7 l* B10次落地时,共经过多少米?第10次反弹多高? # k% j- n/ X; e2 \
1.程序分析:见下面注释
2 |$ L) y* L( b; |# G! R2.程序源代码:
9 O6 t' w! o* h- }* V6 F$ ], Pmain() / k# g% T( B+ J. Y6 Z8 j9 m) R
{
/ s: {6 E" V# T, s1 Pfloat sn=100.0,hn=sn/2;   c* U3 h8 h. R* L, C9 H/ Z
int n; 6 P0 Z" e: u- n- b+ M/ a4 L
for(n=2;n<=10;n++) . t0 b! D3 F; B6 @5 g# B& v+ `5 {, [# S
{ ) r; o4 A5 u+ T+ k4 x- E2 @
sn=sn+2*hn;/*n次落地时共经过的米数*/ . p; `( y8 R5 {9 G3 a* d
hn=hn/2; /*n次反跳高度*/
% T3 b( u* _: c; s  y) W% B5 s* ~0 i}
! T& t# m9 {7 ]$ Nprintf("the total of road is %f\n",sn); - q  T4 I( @. c0 L) x1 I
printf("the tenth is %f meter\n",hn);
$ K* v* b$ k; i) o4 z}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
" V( [$ S/ L4 M$ C% V1 c+ j8 ~: R   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下# x, q- u9 ^3 Q: Z5 N) w0 J9 T, B
   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
, H) [, n8 |; B4 r1.程序分析:采取逆向思维的方法,从后往前推断。
2 o! D5 [$ `7 V( X! w% y: s3 H9 F2.程序源代码:
6 b6 C0 K1 @) a8 h' ~0 T2 ~main()
& V+ M6 d8 E! j. g0 w# s{) @, z% S+ C8 C# `6 L" j
int day,x1,x2;
7 r, h9 R: J$ s  Y) ^9 \day=9;. W* h' S& g! {
x2=1;
* S/ D# f: m+ [$ swhile(day>0)
& a' b% P  D. J: d, u# p$ q0 C {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/
+ P0 i8 r+ z; K# t& R x2=x1;: K5 V0 |, n. n" Z$ E" Y
 day--;2 |1 V/ V$ K- g( j. I) [$ F- ?
 }: v7 K. j0 H: ?/ S
printf("the total is %d\n",x1);4 Z4 e# Z$ P& F% D
}3 B( P8 u- ]3 @& e2 t! ^
==============================================================% q- z, _& E2 v' h  _7 ]4 J6 H
【程序223 \& ?6 L2 z( Z9 `
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
2 H/ e& N! }& Y, g: i' D6 f/ E; @  j   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出8 |' x: F9 R. ?7 D! F& O4 M; t' A
   三队赛手的名单。 3 E% z! |( L+ x* X) m
1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,1 d5 ~$ c- H3 c4 n- p
      则表明此数不是素数,反之是素数。       8 Y) y9 n9 B5 S8 c
2.程序源代码:( T0 i. h6 w  e
main()
) C$ D$ l$ G" \4 h- U9 K% H, T* p{
8 f8 P, s' J. q- B' n% M9 ochar i,j,k;/*ia的对手,jb的对手,kc的对手*/
, I8 n/ \, \0 i; s9 p# Xfor(i='x';i<='z';i++)
3 Q6 e& G3 ?2 @* G/ R6 R for(j='x';j<='z';j++)
2 I4 Q2 A6 I4 f+ I0 t7 |5 D {: J0 D4 H1 s9 L1 `) Z  H! N
 if(i!=j)3 k0 [& A' K) L( X
  for(k='x';k<='z';k++)
5 s  e7 H* S. Z! ~  { if(i!=k&&j!=k)  S& b9 D0 q/ t4 U3 C( j
   { if(i!='x'&&k!='x'&&k!='z')) ]5 z  L$ k* ?. Z, G
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
4 T* R7 }$ N! c& Z+ E5 w' o   }' j' e& `7 W$ P
  }# Z- |* t. `" j! S: e0 v
 }
1 N$ c5 a; H; {9 V9 S}2 q$ o- g! ]9 r7 j) M7 a) S2 V- Z
==============================================================. F$ o5 u  \; C
【程序23
: v0 d6 a7 {2 `0 u, s- e题目:打印出如下图案(菱形)
*
, l0 i3 i, H! c***
& o& ]9 H0 N) y7 C******
3 f1 ]& G, l; ]6 O$ j) N********
$ Y& U6 q" Y! \******9 [" s- W! i! z5 _0 p
***
) B0 d/ P7 ~$ @*8 p3 H: a- ?- ~
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重' `$ i1 U$ C" S& o! I( r, ^; V
      for循环,第一层控制行,第二层控制列。
) A; s  K; h4 n% r3 Z2.程序源代码:2 y# o9 x2 o# g. @" m) H# |
main()
! ?" C0 g9 f" K6 O* }{
  t2 C+ Y1 x! f0 U' g" W. k$ yint i,j,k;
% k9 S  Q) ?  M  n! Ufor(i=0;i<=3;i++)
9 N" e) a$ O1 ^' N% T' S {) o! `' b0 t7 M9 t+ ?9 K
 for(j=0;j<=2-i;j++)4 _. b/ q/ Y. E: _4 Q$ v- I( a
  printf(" ");( f" ]" B6 R* O- m* b! h' `
 for(k=0;k<=2*i;k++)
1 t' W' [! q0 o! a- B0 {4 ], v  printf("*");
& R: C& u6 R: h; b( ^ printf("\n");
& m. ?6 z; q) ~4 q }
$ U' M/ n! Y. h. ]  @; @* Ffor(i=0;i<=2;i++)* A, {) ]3 }/ B/ l) n* M
 {
% L& J; b, g2 L2 Y for(j=0;j<=i;j++). Z! K8 v# G8 O; _" ~$ P
  printf(" ");
& t; v) s; j. r4 y for(k=0;k<=4-2*i;k++)
9 m! m& ], ~& z! L8 F( P$ I( n2 I  printf("*");+ u* b2 \* b" F+ V, r4 e+ _
 printf("\n");! x- k7 m, d6 r. Z
 }- ]* W8 K7 h1 x2 P
}
! K8 z' O! b: o; F: r, q$ G/ D==============================================================1 ~) M1 y  d& J0 {
【程序24  l7 r- m5 `3 z" W' r% e
题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。' M' C- }( w- f% \9 q, v& O
1.程序分析:请抓住分子与分母的变化规律。
; S1 r- G4 ^$ ~2 j1 I9 ~2.程序源代码:
# F5 Z: S) o5 Z) amain()
9 E& D1 f8 _- ~9 B- y0 U; G( [/ k{
! {/ L( c0 e3 \$ c1 G8 B$ gint n,t,number=20;
8 A3 |! L/ \2 L) Yfloat a=2,b=1,s=0;1 y+ y7 Q) M% f, B  X( q
for(n=1;n<=number;n++)& ?9 Z8 `3 y* P+ e
 {+ |. G& s3 Y$ k
 s=s+a/b;( v6 N4 X+ @+ j
 t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
4 d4 K3 J; H$ b }$ `1 A$ b9 |8 |8 M% V9 o4 K( c
printf("sum is %9.6f\n",s);2 ?1 \2 b6 T- S( D) c4 l
}
* E8 d7 Y8 N0 c! M" A, A' F==============================================================8 ?, V2 I( \1 M% g7 q9 W& j) ^; t
【程序25嵌入式学习企鹅要妖气呜呜吧久零就要, p6 p, k: U* P; A
题目:求1+2!+3!+...+20!的和
( @9 i# q7 f8 ?+ X1.程序分析:此程序只是把累加变成了累乘。
: ^( H* f3 z) e+ m2.程序源代码:9 r$ I4 [7 e; k3 E) {8 k
main()
# A' x; e  W. a# o{$ Y1 U1 G/ B: [, C
float n,s=0,t=1;
$ J% R7 ~2 R- ^% m  hfor(n=1;n<=20;n++)
/ `2 B+ b4 D" R2 A2 O! ~$ W9 O {3 x) o. D' s8 J$ L( g8 m3 q
 t*=n;& P6 Y( V1 c; e5 M0 e5 {8 e
 s+=t;! H5 W2 |3 |( W5 n
 }
/ L" K. ^/ H* X! y3 Aprintf("1+2!+3!...+20!=%e\n",s);+ j; k0 _. o  R0 L$ @
}
# w5 P7 `' B' p) q2 _==============================================================# X' Y3 l+ M. _$ K* G3 p: p
【程序268 J6 z/ T9 X" ~1 X+ [, J2 `
题目:利用递归方法求5!3 l6 _4 E+ V6 s! ^3 J2 w# Z
1.程序分析:递归公式:fn=fn_1*4!, \1 S1 O: k7 {3 H! T, X
2.程序源代码:1 r0 P2 {6 u) {4 t
#include "stdio.h"
7 G; u- Z* h5 h; G) k" B5 x8 @; S! Xmain()( N; W/ o6 O# |0 y2 ?
{
* ]3 B# H. n3 {( ]int i;
7 R" K6 C$ D$ D3 Q6 b! Hint fact();
) M" G  K: j4 M- o3 R5 Yfor(i=0;i<5;i++)
) ^: d$ R0 z- h printf("\40:%d!=%d\n",i,fact(i));' O( g1 K% t, s* W8 Q" Q
}
% o9 H2 w( J1 B+ D4 dint fact(j)& \3 _! R# b: L
int j;
- E5 T/ _' {$ M1 X4 _  D& Q{
5 F8 N% E/ V7 m5 J3 Qint sum;5 e% k% _, r2 g( @8 a) r- ~
if(j==0)
6 S) N  Q" J$ [! N8 E: f6 k. m sum=1;
) a- G% R; D( S, u3 kelse
; _5 c6 h' h# M; y1 j sum=j*fact(j-1);. @% }7 [* O+ c7 b
return sum;
; u3 w* s! s; i% c4 z6 e}
& u# I1 J5 H- K3 h# b8 F==============================================================

' g5 M7 x- [" F8 {9 ^: \# W1 H
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 14:31 , Processed in 0.060874 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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