找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3128|回复: 1

C语言算法16-26

[复制链接]
发表于 2017-10-6 15:41:14 | 显示全部楼层 |阅读模式
【程序16
* Z$ V' T) y0 R题目:输入两个正整数mn,求其最大公约数和最小公倍数。
9 ?# S/ M5 Z8 S8 p5 D' v
4 _# b/ B, l  v* a3 P# w2 p, M
  u& [" k: Y* a: [( z- E9 t+ \: _2 G
作者: zhlei81 2005-1-22 11:30 回复此发言
/ h( _& ~0 t6 k+ [. ?2 k% u1 q2 R
--------------------------------------------------------------------------------
7 ^8 F4 H( d2 g& h) |+ h7 d' J1 c" a- ^/ {9 ]: a8 a( n
4 回复:经典C源程序100
8 l( w. y8 _* o3 _; n  X1.程序分析:利用辗除法。
, o: Y7 w; D. l* r" V: C- U5 p. Y# ]8 b
2.程序源代码:
* M+ U$ {6 P" Smain() / }7 S; B5 k' S6 A5 _5 ]  V) X
{ / _9 s& T/ p* g' S
int a,b,num1,num2,temp; 0 w1 t$ _' f' i/ N8 O
printf("please input two numbers:\n");
9 q& Z7 V! m  e9 Fscanf("%d,%d",&num1,&num2);
, t2 p* y8 \4 A: y- F& \$ Eif(num1 { temp=num1;
% ?# F  M0 u/ d/ d: J+ R- Vnum1=num2; + \! J5 @# F& T) Y5 r. e
num2=temp; ! Y$ e. D. D) ]8 _4 C" R
} * O$ L4 B6 K1 p8 y6 S. [3 B  r; v/ u9 ~
a=num1;b=num2;
% f9 P! P+ S$ J) gwhile(b!=0)/*利用辗除法,直到b0为止*/ 0 v; J- p! [$ q( z* K( t& N( h
{ ) {5 Y" _- B, V- g
temp=a%b;
+ ^; W' s2 R! q8 e1 q; n) X% ia=b;
( v4 S* ^" O' e6 J; mb=temp; ) C- U1 L. D. {6 l* R5 l# G' x
} ; L4 I( G$ F6 i0 u) L/ b8 Q  |
printf("gongyueshu:%d\n",a);
& T3 `4 w) l9 I. Aprintf("gongbeishu:%d\n",num1*num2/a);
  i4 G5 ?+ {5 j}   P; s: R. q' G
============================================================== ; |7 m" ]+ E5 K+ V* \4 v1 o/ P& b3 G
【程序17
5 ]9 ?7 a4 t7 S' C7 W$ }1 i% t% R题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
- Q6 j; k% w+ L( R" Q1.程序分析:利用while语句,条件为输入的字符不为'\n'. # f- ^) B+ O8 w& b1 V' l. s* |
- p$ n8 N$ l% D: m8 w
2.程序源代码: 5 O. ]2 ?8 @+ Q7 g/ g0 }3 t7 i. L1 v
#include "stdio.h"
" M$ }( i$ D+ y3 O5 nmain() - @, F0 I7 c. ?# \, h3 D
{char c;
2 z$ z! U6 _) U) r+ Eint letters=0,space=0,digit=0,others=0;
% _# _- p% N" W4 r6 g3 c: t5 ?printf("please input some characters\n"); - h3 T9 j. m# e7 K- y& b9 @# J, Z5 f
while((c=getchar())!='\n') 0 W9 j& B7 x& A* \* v1 a" Y  x! j
{
7 K. l0 A7 K2 P1 h2 xif(c>='a'&&c<='z'||c>='A'&&c<='Z') 9 i; G2 ^: ~! |0 A
letters++; ! o( i9 P2 r% Q5 y/ e
else if(c==' ')
' F2 U. k2 z% i/ mspace++; 7 u+ ]4 A$ }% G- u7 }% E, n2 L* Y
else if(c>='0'&&c<='9')
$ @3 d0 G# L) J# @( e7 e. xdigit++; ' l3 }7 j0 E5 f7 }( L* X! a6 w
else
# A3 F! \3 W; s4 b+ D# t0 i' Xothers++;
: c: ^  E9 h  b& U7 }& l$ [7 C( S}
- N8 [9 R6 x. r; Z: p+ w9 I* t: cprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters, ) P. |4 s3 h! {0 N- Q
space,digit,others);
: C2 T2 o+ o/ ]: k; M9 S$ r- a: @}
1 T' U: u0 Z- ?, |' L) E============================================================== , C4 A9 ^7 U' }$ R# F
【程序18
4 X9 U$ X/ H; Y) R$ x6 L5 j题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 6 a8 L" ~% x8 u7 \
共有5个数相加),几个数相加有键盘控制。
2 F8 C1 H  v( M: y4 W1.程序分析:关键是计算出每一项的值。
$ l% a/ _7 }: _2.程序源代码:
$ {0 g* M' w+ `0 T% ^0 i5 tmain()
' q, B3 L1 m6 k" z7 j3 C1 m{ " Q% q. W  S# ~( Y
int a,n,count=1;
: I( K8 m, R' U: o; A) v5 zlong int sn=0,tn=0;
: A# ?5 Y9 ?9 jprintf("please input a and n\n");
. x9 ^; N: b% h) F. `1 Bscanf("%d,%d",&a,&n); : A8 x/ Z. [) N4 D0 G5 q+ k9 U0 B
printf("a=%d,n=%d\n",a,n);
9 A8 F7 v7 {/ E' Pwhile(count<=n)
$ p* s- ?, l. Y$ w3 I- b{
/ G. x+ u" P+ h" @6 E0 \, {4 dtn=tn+a; 8 G+ Y! T/ M; A8 L. E
sn=sn+tn;   T; ]/ A' ]5 f' w, y
a=a*10; $ i) Q1 {9 Z7 U
++count; # z5 o% w! N5 u  N1 u/ V
} # G, k5 @/ X5 y! Q! B' N7 s
printf("a+aa+...=%ld\n",sn);
* v. u1 o& e( u& |- g7 X}
) [: {2 k$ v6 e: R; _: Q==============================================================
9 i# w7 N. J: o1 R) Q& t7 Q1 X【程序19
) a2 c3 A% g, d2 e题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程
9 u* p, D- f! i! @% y$ y5 L找出1000以内的所有完数。
9 B1 F1 W9 G* k$ m" B; @9 K7 U) `1. 程序分析:请参照程序<--上页程序14. " ]+ |' Y8 X; q" P$ S# o
2.程序源代码: . _5 S8 T) u- n- g+ d
main() ! w- q/ p) Q9 M9 E! k; F
{ 3 ?0 y/ G6 A: K7 p
static int k[10];
, H+ q9 N( x7 R7 v5 s+ q* V- v, [int i,j,n,s;
: |; T) T0 K7 R6 [# n! C( wfor(j=2;j<1000;j++) $ _+ `, W4 e1 ^9 y+ b- G
{
8 Y0 G0 [% ?4 L' A2 b; Q3 O* Yn=-1; 2 d6 Z3 u6 Z! c$ ~/ R
s=j; + J) i( u  W# ]! |! N) `- v
for(i=1;i {
# d3 C, M: r( S; Bif((j%i)==0)
. h5 m! u. |- N: u{ n++; ' b2 T. ]$ K) c' A1 ?" t; A4 I
s=s-i;
$ r+ R4 @( a2 ~  Gk[n]=i; ; |2 d7 r, Z6 y$ W$ o
}
. v! R, _6 m% L7 A  L}
: b8 Z9 h/ v3 iif(s==0) 1 k9 h+ M6 r* {" a0 s9 O
{ ( f- d5 z2 B1 ~* E4 o$ z$ m0 Z
printf("%d is a wanshu",j);
; l/ }6 a$ ^0 H& kfor(i=0;i printf("%d,",k);
/ g% t  X; A% W% g( }0 ]+ Dprintf("%d\n",k[n]);
5 F' Y! e1 z0 M" ~) F' i} ; {( N) l! l! Z/ l
}
8 o7 m' W8 L! C. m}
5 t- m7 `' y) \7 a2 K0 Q- x==============================================================
: {. m3 D* n  v) l& G【程序20- j0 \. i: V, c4 Y( E8 w; H1 @: G) U7 w
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
; M& l* B" v0 S1 w10次落地时,共经过多少米?第10次反弹多高?
) p! X  |: U6 I2 O6 L' i1.程序分析:见下面注释
* M" D* ^" j( b/ ~2 T2.程序源代码:   m5 [" S6 D! v5 m
main() 2 s9 b) b7 A* j+ O- H/ Q7 b* ?) e
{
6 n$ O7 Z' t/ P2 p- M9 sfloat sn=100.0,hn=sn/2; / |9 h& C2 w5 |' s$ r
int n; % ~7 N/ d, B' y9 e9 i0 q
for(n=2;n<=10;n++)
9 r  N% u3 T8 C* E8 K2 e{
  U1 g' z8 y' Q/ M3 G! j+ {2 ^4 \4 wsn=sn+2*hn;/*n次落地时共经过的米数*/
! G( I4 K' B- }; Y+ y0 c6 s  Thn=hn/2; /*n次反跳高度*/
" i3 G9 c& u5 j0 G}
) `! l4 B2 ~8 e3 E, Eprintf("the total of road is %f\n",sn); 5 j+ r. J# U0 A; y- R. K# ^
printf("the tenth is %f meter\n",hn);
* w. L$ v% H9 C}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个7 H/ Y% w9 n7 F* x, b
   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
* f; B5 J4 W' @" ], `% `1 b   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。: v7 Q/ d+ J! f  s; ~0 C
1.程序分析:采取逆向思维的方法,从后往前推断。
9 G2 t8 j% w! V1 F2.程序源代码:$ F! a( I! b, U: V, J: O" I1 `# K
main()
/ A  i5 Q8 r/ e3 Q; Z/ E{
! J( g+ t5 q4 R: c; y" Tint day,x1,x2;/ R: j. @6 p  i; v; q7 r
day=9;
6 u/ J! g, p# g) n' D# D6 Ax2=1;
0 _; x3 a4 [, z) ?" G  Nwhile(day>0)
- _5 Y- m9 j2 B {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/
+ M+ g( h  p: o x2=x1;
" i( D8 _2 ?/ w/ `) r/ {8 t7 q! F day--;3 c2 {2 W2 v5 ]4 f( e
 }& {. m" v! }- u# G* Q# A
printf("the total is %d\n",x1);) f4 ?) b0 k1 m# i' J: d
}0 e& e3 O! s1 [  @8 U3 S% b
==============================================================
9 m8 \/ J5 n9 f3 c【程序22. U; o; {6 T# `; [
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定! d1 k$ c: L! Z7 b' v- L
   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
7 w6 q/ I9 g; o! h   三队赛手的名单。 / p- V9 @4 G$ d% c
1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,+ |) \3 F6 B( K1 e# e
      则表明此数不是素数,反之是素数。       
8 h8 k9 A6 W. s. Y2.程序源代码:+ d1 G3 `  \' n: h; L
main()% p% ^. u6 F8 y6 I" F
{
% o5 |. {8 W. h0 mchar i,j,k;/*ia的对手,jb的对手,kc的对手*/
) u8 q0 ~# O) {! x) x; d- J+ Nfor(i='x';i<='z';i++)
. }& m) P4 w5 z8 t* D9 F( N for(j='x';j<='z';j++)9 n& C, `" {& I2 |
 {' j0 O7 `/ O* d  Y, n! x& o
 if(i!=j)
( ~% v8 {1 X4 p  for(k='x';k<='z';k++)
9 I5 w2 l4 i$ Q* g6 n; N  { if(i!=k&&j!=k)7 n# K3 ~% g0 n4 Q' u
   { if(i!='x'&&k!='x'&&k!='z')
! P: o  I7 \, h$ z   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);, D/ H, q7 c) R9 @
   }
" K8 w- p6 @+ ]% A  ]  }
" [) ?' A" u2 w* Y% P  N) Y' j }. I9 N* ^" s3 {/ Q6 [
}) M2 M! S& M0 X+ G- i0 c
==============================================================( O$ J5 B9 i- [  D
【程序23
: |3 N! h' z1 p题目:打印出如下图案(菱形)
*
( J9 z- L/ G- j$ }***
5 K9 l& X$ O* P% `; n# L******
0 A5 q2 q& E2 Q! ^' D# L0 ?5 X********
: k0 V: b9 M/ J******6 y! d0 h0 Z- ~: C6 e3 d, L$ Z
***
! w. e. |. F' H*( D7 d4 R5 v2 |% ^5 o+ j5 L6 I0 i) Y
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重1 U) W# S# P) B  z3 @! l
      for循环,第一层控制行,第二层控制列。 3 t9 v" C: S5 l/ m
2.程序源代码:$ S1 Q* P  Z' q* Z8 f3 ]& V
main()
0 ~' Y! ]8 J. R$ V{
3 C/ Q0 {3 Q: L+ Zint i,j,k;
- P. w" v1 B  C4 F6 ~  ffor(i=0;i<=3;i++)
0 y4 J2 c! q2 o; A5 U* W {
# O# o" U  j1 ]% f" |* @) [ for(j=0;j<=2-i;j++)  s; v# H6 M9 Q# `$ f+ E2 j6 @6 g
  printf(" ");' H* p# F. @0 U# [; _: }2 Q
 for(k=0;k<=2*i;k++)
# t8 f) ^, J/ K( ]* U  printf("*");
) a) Z- J, a' i  e8 y( ~' X% H printf("\n");
3 @2 g" n0 `# M/ Y1 i' X }
! v) O5 y& B' E3 ?% e# }1 kfor(i=0;i<=2;i++)
+ e. \; ?: ]4 x" M {
& W4 t; K/ }* X2 q for(j=0;j<=i;j++)* g4 S) O4 w$ T4 U6 x. C
  printf(" ");& C/ m, ]. V  W5 T1 l
 for(k=0;k<=4-2*i;k++)! W. z- i1 h- F2 n
  printf("*");
6 H' `1 D- v$ J& z2 n7 W printf("\n");
6 y( t6 ?6 s7 e/ b }# V3 V* g2 E. u* y; U: s$ ^
}
/ ~# O% H- i! G$ i& i==============================================================8 ?# }, m! ^- @
【程序24
, p" s# B2 g; B0 i+ n# t/ o题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。0 `* W: l( ^1 ]' O' e9 U
1.程序分析:请抓住分子与分母的变化规律。
" R% m: X7 q: c1 e' p2 \2.程序源代码:3 M% g0 G* Q- n  K
main()4 g% Q, s, C; [$ [) L' C: C
{
3 Y; O, p( H9 ~( Yint n,t,number=20;
+ o9 W2 i' n' x. Vfloat a=2,b=1,s=0;3 Q8 Y- X6 g+ F$ F! ~* C
for(n=1;n<=number;n++)! \7 I  O3 {! R
 {# n4 I8 p; o& I  r5 D$ V
 s=s+a/b;
( t8 d9 B) B- m0 m' } t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
* X) K& x. M8 @' F' a, |2 g: N }: ]3 l- i" o2 L; \4 [5 n9 L$ j; H
printf("sum is %9.6f\n",s);
0 u- C( G1 s6 s' ^6 G+ j}
# u; w6 x; H7 i4 B8 _) ?==============================================================# H3 H0 J& |3 h2 i
【程序25嵌入式学习企鹅要妖气呜呜吧久零就要( \) ]; G6 e: c( t+ s# C1 s) V8 O
题目:求1+2!+3!+...+20!的和
) _' N3 C/ }- a9 P8 p1.程序分析:此程序只是把累加变成了累乘。 5 `  b: K! x; m$ d* m: _
2.程序源代码:
. Z4 s1 u3 r+ cmain()6 p1 a$ G% K2 {+ B) e
{1 K. M3 B/ R+ j* ]
float n,s=0,t=1;
( F# @- L* k/ v  Wfor(n=1;n<=20;n++)% K( @; ?5 U: w- v- L5 y2 ^/ P
 {- j9 \3 p/ s4 ]1 C3 M3 d3 p4 [
 t*=n;* ]# Z; ?- H5 `
 s+=t;5 O9 Z' y2 v6 x* X- s: G5 y
 }1 C0 e( M- r4 r- W7 M
printf("1+2!+3!...+20!=%e\n",s);: E" m! f# c3 Y8 i2 ^- u
}
! W& M6 q9 ~! O, T! i1 f==============================================================
' g0 q" N- J, O7 h! h2 ]6 V! |【程序26% G# }7 l6 G; I, M1 p
题目:利用递归方法求5!0 u7 i5 L; t9 a  P5 G/ s+ Y
1.程序分析:递归公式:fn=fn_1*4!& \" g( L4 X5 t5 Y0 j2 a+ ]8 j5 c
2.程序源代码:4 r8 k5 H' Q4 w+ W
#include "stdio.h"
8 \2 I! ]: i' l& ^1 V& }main()
  O1 `- O# }2 L# ~' i" [* R/ r% w{; L& x2 X% r4 Q2 J" j
int i;
. @* [8 A: ~4 Q8 W8 b% G7 w$ Sint fact();) J" |3 ]6 Q% \  @3 Q  z' n/ t; [
for(i=0;i<5;i++)
8 f: r3 x8 u0 ^/ U2 \ printf("\40:%d!=%d\n",i,fact(i));
9 O. _: @! }$ g  n& z/ v}5 Q! M2 V, o$ Q, ]- K4 P
int fact(j)
! c7 A( Y  J% f7 Q( ?1 h6 T  O0 }int j;: U3 @, A% p. Q
{& I& N; E2 ~9 Q/ H' F
int sum;
2 `7 m, g8 c+ q; gif(j==0)
. t( f& L7 c4 Y4 i2 `6 D sum=1;
5 }. A5 y( h$ ]" @8 pelse
/ G8 f( b; T, d7 W) ] sum=j*fact(j-1);0 r: a- N# A2 Q
return sum;
! x/ V: ?- U; |8 g% t# j}
# j+ K" w. j+ H" Y. S5 e) A==============================================================

% E# k% \9 p2 M3 {% X  L
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-17 08:32 , Processed in 0.072374 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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