找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2999|回复: 1

C语言算法16-26

[复制链接]
发表于 2017-10-6 15:41:14 | 显示全部楼层 |阅读模式
【程序162 _  [. Z8 H% e0 T1 g/ o
题目:输入两个正整数mn,求其最大公约数和最小公倍数。
5 n4 G9 Q* F+ M, ?+ Q! g
# m" L& H9 g) p1 s# p  V) r/ q* j* ?5 z. @

9 h4 e9 v- A+ i4 ^4 T+ x# y作者: zhlei81 2005-1-22 11:30 回复此发言
% z# D* f4 ]: r) y5 E9 W9 s& ?1 Y7 a* F6 E0 n  k
-------------------------------------------------------------------------------- + h# w0 X8 [  y! w% c4 H
+ W, {, Q  F( q1 G5 _' N5 d
4 回复:经典C源程序100
4 g3 C7 L* y# \1.程序分析:利用辗除法。
/ B6 d' I/ P" V, T
: h# R  W; B0 t& i+ M9 M2.程序源代码: 2 N6 E0 D1 q* j& h
main() 6 c$ y7 A# z- D$ a5 f. F8 M6 p
{ 1 O' q( @  B8 {7 N# y  R
int a,b,num1,num2,temp; * y* A6 F* U' @- C3 P2 l
printf("please input two numbers:\n");
7 ]7 C# T6 L% J. Iscanf("%d,%d",&num1,&num2); 5 I% m8 H: U" H9 W3 k7 ^
if(num1 { temp=num1;
" T9 N2 N2 X) T* n" N8 |& Ynum1=num2;
' ~& R& t3 K& k! E" qnum2=temp; 8 V3 @) Q% G" \
}
7 f2 l& q1 i  `: w# x+ h' |& da=num1;b=num2;
# ]/ W$ N% d9 jwhile(b!=0)/*利用辗除法,直到b0为止*/
' q& f7 Y; U/ U) K{
5 R9 O$ O0 W! a- d/ Ctemp=a%b;
8 b7 Q# p" q! X" |4 G3 q& X! r0 xa=b;
9 X" a" q5 L/ mb=temp; ' V, h' R- E/ H2 {0 z
} 1 Y) ^" w/ @4 p# J& ^9 U0 p
printf("gongyueshu:%d\n",a);
9 J: v( O) q6 H. a: @: R6 I7 Pprintf("gongbeishu:%d\n",num1*num2/a);
( _6 J( B6 n9 n/ i" t( d* F* X- ]7 n}
5 }% G! [8 O- v/ v' p==============================================================
% X- ?- [/ P* J【程序17
6 k1 X8 s& ^# L  F. B题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
# P7 c/ W) g$ s' j4 T1.程序分析:利用while语句,条件为输入的字符不为'\n'.
* Y! y( f! P! S1 w' J" b! l) ~5 d' n& h% b" ]9 }
2.程序源代码: 1 f: C7 z  I, R2 q$ P& G- {
#include "stdio.h"
4 [2 U$ h& N9 N: Y7 R5 P" ymain()
6 z- x) s+ d. m{char c;
6 d# m( b! ]! H; `! a5 cint letters=0,space=0,digit=0,others=0; 7 `; w) P, B: a8 v0 s
printf("please input some characters\n");
  r, V' }( ?( ~& I) F& Hwhile((c=getchar())!='\n') % j7 g9 F* |& R% b
{ 2 p  G' M+ L! ~# R' K: w& w
if(c>='a'&&c<='z'||c>='A'&&c<='Z') ' q0 {" O7 L* J5 i, d
letters++; # z2 ], a6 f" j
else if(c==' ') ( [* b7 H+ y: F* ^
space++; $ Y" _, P4 r+ r! L7 x" u
else if(c>='0'&&c<='9')
  E) O' r5 M( g4 }' c% [) g: fdigit++; ) v3 j; m2 a4 `6 ~
else - b$ F4 |* |/ a8 j* w
others++;
8 x) L) f/ a4 B4 }}
9 B- h0 G* _' M% w* Xprintf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 5 q( _/ O; U. |! S
space,digit,others);
; k3 P5 D& I# w4 {$ O} 4 t2 a* x/ m/ w: H8 l
============================================================== ! w- Z* a) n" J0 g( W
【程序18
% o8 c  q+ e( |: ?1 l题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 0 ]4 R# {5 ^0 Q" i0 ?2 v& B
共有5个数相加),几个数相加有键盘控制。
* d8 S. p( @4 K. m1.程序分析:关键是计算出每一项的值。 " E. p3 u; C0 O. J* a
2.程序源代码:
  B# L4 q, Q  d" X, \main()
  a3 t& h: p; U: Y{ 6 E# H% c: Z( z2 e  J5 T3 d
int a,n,count=1;
- x0 l# c* ^% P9 ^+ p4 U7 Llong int sn=0,tn=0; % V4 {/ f; l8 A/ l
printf("please input a and n\n"); ; X% K; S- J/ `5 n% q, S
scanf("%d,%d",&a,&n); 1 }' o/ l# j9 J/ D6 ]) o" x
printf("a=%d,n=%d\n",a,n);
7 M; N, s6 D5 S7 d- R. K- vwhile(count<=n) 0 t0 P- c# G, L2 {  I( M8 ]* Q
{ / X- ^; W- W2 O, @
tn=tn+a;
( {8 C. E: S" L2 H$ o0 Osn=sn+tn; 6 n: i" q3 M7 x3 B% M7 o
a=a*10;
7 g' ?. d. U' }++count;
7 ]6 L% g: T, U( b# Q3 ^7 R7 M} $ }2 |8 B" X) O
printf("a+aa+...=%ld\n",sn); % q* ?4 I3 B, _, s: e
}
0 t, A& O3 K: C! r$ Q* K, z) S============================================================== , U2 o* i! P" `- ~; v1 j
【程序19
2 k8 `: J7 {" o% e6 N题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程 2 v# H- ?1 D4 ^$ y* F
找出1000以内的所有完数。 " W$ f" L7 m( M
1. 程序分析:请参照程序<--上页程序14. / O% [! M) `, P. k/ w7 h
2.程序源代码: " Z; z  b- h3 U
main()
, g' ]4 ^& V- F" O{
" |( U/ P$ V, O; X7 u% X! h8 ?6 r! U6 c8 Jstatic int k[10];
7 ?0 g' D" u: {9 |$ N4 Hint i,j,n,s;
0 k; ^$ k9 w, ?' `9 D$ a. \for(j=2;j<1000;j++) 2 J7 m" B" {8 D+ h1 x
{
0 c0 t6 J# l( ?1 t" I9 \9 z: t( Kn=-1;
2 J% n; U8 e& N! ~6 R/ J9 Hs=j; , w( ?4 c- U9 `8 H
for(i=1;i { 9 x( H1 `$ W8 {. i
if((j%i)==0)
" C/ X  n( \$ f{ n++;
: W2 p- k( T+ R8 h( p: `3 ~0 U$ W8 Rs=s-i;
* Y3 N5 d1 s. R+ n5 D1 M+ X6 d$ e' @k[n]=i; 6 ^) W4 P  w6 }+ {1 b* E
} 1 R4 A2 h3 w$ z- T
}
9 t! y" M2 G6 ~+ P- Q/ P% _if(s==0)
5 n9 C, h$ Q6 V. j{ 4 p6 |& ?% U  v+ z
printf("%d is a wanshu",j); . |8 a, V; t( g$ G5 c# }
for(i=0;i printf("%d,",k);
# |! `* G; Y9 ?printf("%d\n",k[n]); 7 f- S4 t: }9 g" f- J6 a/ r! t
} - g: s% S  y2 y2 u
} ! P2 D' t  j6 U9 k5 U
} ' w( b3 {' y; B( W
==============================================================
# Q! U. V$ i& L, O. Y. X- i* f$ M【程序20/ \8 n" S( `3 R; F4 f6 [9 A# x
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
! O9 O: M5 H1 T& I4 G1 m. y6 n; |0 d10次落地时,共经过多少米?第10次反弹多高?
. f" J5 T8 Y, B9 ]! a3 w8 H1.程序分析:见下面注释
2 }( w8 w; v" U2.程序源代码:
( t2 Q/ }2 _' ^5 x$ j" bmain()
5 K8 X4 e) X4 }9 [3 r, N: O" d% v{
* j% J# |5 P8 [7 _1 M$ Z3 Rfloat sn=100.0,hn=sn/2;
- G4 j5 w5 J$ h! T: dint n; ( F7 g: n, a* ?+ K7 S/ h9 ^
for(n=2;n<=10;n++)
8 `1 }4 @5 E8 D; A% {' p% }4 i{ 5 D: ?4 A6 M+ j  `9 A0 {
sn=sn+2*hn;/*n次落地时共经过的米数*/ 7 @% f; {5 g# f' X  g, U5 g
hn=hn/2; /*n次反跳高度*/ $ z+ X0 U2 w7 J! L
} 9 c7 D9 r8 F% Y9 b
printf("the total of road is %f\n",sn);
% Z, [. }  U9 v- k) A8 mprintf("the tenth is %f meter\n",hn); 5 c0 @( z3 P; |
}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个8 \* C6 I" Q  i" H' f
   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下: j0 t1 T3 C6 X1 D
   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
; A" x& U" O$ l1.程序分析:采取逆向思维的方法,从后往前推断。
6 S( |+ o* M8 [2.程序源代码:
, A& {, t: x- W8 t% D9 `main()
; a: F. r5 y; r% N8 G% Z8 I{6 ^; E* q4 s0 E6 K: T* ~# e
int day,x1,x2;
% g1 ]& @  g; x; y9 eday=9;
6 @3 R- z7 \5 c2 W1 }  n4 Q. e* Ix2=1;3 \" r/ F! o7 q# g" N) m
while(day>0)
- C0 ?* F1 ?. L. P3 ^0 n; J; }/ N {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/
! c. u4 z5 D% l x2=x1;9 c2 V( k, }) o& Y$ d- F  {/ d
 day--;
" ^9 s0 X& P5 i: x, L" P' u7 g }
% W- o  m4 [: ^( U6 Lprintf("the total is %d\n",x1);7 T! V5 e6 J) `, P8 d4 K( T
}6 \4 {5 y3 \" A5 u1 G0 B! f0 Q- j
==============================================================
' }/ y% z, g( d' F; n【程序22
- R" M0 Z9 u/ q/ q" Q题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
* I  s! e4 b% |, I# d7 w( a   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出" F/ v! `: X2 I2 M
   三队赛手的名单。
5 x$ Y: J8 \5 u6 _1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,
: w- ^0 |! _! Z      则表明此数不是素数,反之是素数。       
* u8 i; T- \  P0 c) y6 u2.程序源代码:
6 E: m% X! y. M! H; d. \$ L, ^main()
2 N4 w' ^+ H1 X3 h: `" c' i1 Y{$ b5 S7 f6 a8 s! r
char i,j,k;/*ia的对手,jb的对手,kc的对手*/* D  M" h  @) v7 u$ j( X. X
for(i='x';i<='z';i++)
( \% l1 M) E  O for(j='x';j<='z';j++)& j$ H4 H7 [0 Y: [: U. J
 {0 i" R# Y' e/ l
 if(i!=j)
& D, k( Z- N. Q  for(k='x';k<='z';k++)
  J: n. o# k- t( [! ?4 Z+ i  y  { if(i!=k&&j!=k)8 `" Z% y1 P. V6 ^- y- ]! y  c2 ]
   { if(i!='x'&&k!='x'&&k!='z')' w- a- }+ r! i  i6 x: s& B# e- K8 l9 [
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
, t" ?+ W3 i6 V3 \! }, J6 r   }% u) d3 a6 Q  I  Y
  }
0 V- p. C. e5 ~ }- H$ C. E1 E3 {) K
}
$ q, w: ?6 `9 F9 m==============================================================+ Y) @* e6 ^# J& h3 i
【程序23+ m8 |( u& f0 t* ^: u: `
题目:打印出如下图案(菱形)
*
- t# P! _2 A6 C***
2 B  Q2 m9 E5 p9 D******
7 W% u! [5 S% ~& w1 r********  O7 H6 A- E5 y% f
******& {' D( j  k/ Y0 ?
***
* b7 w% ]& H3 A4 L+ ^*
2 I+ g+ E, y( a7 Y1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
0 \  M+ [; ?& f1 b) K2 {, ^* |6 ?      for循环,第一层控制行,第二层控制列。
& c5 e$ c% ~5 i, X2.程序源代码:1 ?3 N: ^4 o& G5 Q
main()) I& t5 w  j8 d2 ?& i9 m: X
{5 y0 q9 y/ Q, \
int i,j,k;
( t4 ]0 {9 `" E0 z, N7 Z( O( q# Pfor(i=0;i<=3;i++)
* |: V3 A; y* u- h# H3 @! r' b {
$ M+ K6 k" ^8 T9 H- z for(j=0;j<=2-i;j++)9 ~5 {, y0 k2 @& d9 S
  printf(" ");
( Z: J. l, A/ b0 P2 `$ @; S2 G for(k=0;k<=2*i;k++)8 u' ^5 H! t, D# |4 h
  printf("*");
( x9 }/ o" h2 Q, u2 _* q printf("\n");
! G" s' r) d" r }) x# C5 j8 L! \8 v
for(i=0;i<=2;i++)
% Q- g+ a* P3 Z {# |5 |) n3 O" G1 |% X1 l4 C
 for(j=0;j<=i;j++)
" D2 S2 j7 H" U# Z% l  printf(" ");% h. c' G3 ]4 h. ~
 for(k=0;k<=4-2*i;k++)7 ^4 v0 m( T; t0 \; x$ n& t$ {
  printf("*");1 G, w4 n- d+ [
 printf("\n");0 n; R8 x& R- L6 W( ^
 }
: a( f$ _1 U# U4 W0 \+ Q}
, L" N' T3 Z0 K  U/ v==============================================================1 N- e2 C- |# l
【程序24
$ z9 Q9 s4 b1 I8 B& ]4 U/ V题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
; p( e" B6 d5 E8 M1.程序分析:请抓住分子与分母的变化规律。 0 i; z  x; Y! f. q& u$ p1 }: D
2.程序源代码:: q' t' o. N/ {; [2 R
main()
( \! n" w' `. S0 p& L3 r+ I{
: Z3 B; J2 z, Q: nint n,t,number=20;
( q3 G9 P/ ]9 k) X' Mfloat a=2,b=1,s=0;
% [+ Q1 ^" Q9 x5 nfor(n=1;n<=number;n++)& ]7 }& U$ _' f. i
 {' m4 P3 d8 {; B: {9 p7 X  C) b6 ^
 s=s+a/b;5 `" h( q4 o$ p* E2 z  ]8 r) j
 t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/
: K* M( m9 |2 Q }
5 D# ]: E/ E! L: _' Y& Gprintf("sum is %9.6f\n",s);. T- T1 y* V: a; F
}; {; Q! y4 X8 t+ J1 ^
==============================================================7 J5 Z+ |# v' B: @4 N' g8 ~
【程序25嵌入式学习企鹅要妖气呜呜吧久零就要4 Y+ c8 d2 E0 P; [* P
题目:求1+2!+3!+...+20!的和
- S1 B9 l( n. J1 z/ a" S/ A1.程序分析:此程序只是把累加变成了累乘。
) e% k3 J# O* F& e2.程序源代码:
$ x1 o- q5 m6 v# w: Wmain()/ E. o5 K8 P6 t: z! b
{
" t# v( D% ~5 T: W7 z7 R; Bfloat n,s=0,t=1;
) ~: V! j8 ^% Rfor(n=1;n<=20;n++)
2 `- U; ~" J$ Q0 G {" X- b3 f! k7 y5 P) Y; y
 t*=n;
; A  e* {% ^' n/ c$ V s+=t;
. u* B3 `3 o9 L0 M. f4 c8 Y  W }4 g! w1 l/ {* M( E
printf("1+2!+3!...+20!=%e\n",s);7 }# m$ `: l5 b1 o8 x2 m
}
" K( s4 [3 w3 H. F1 a' A' F- [==============================================================8 S1 f  C9 w& }) B
【程序26
$ f* c( D( W1 z) x  l- D  F# F* A% C: V题目:利用递归方法求5!) \% J3 z( ?. ?  M! L' g' U+ \
1.程序分析:递归公式:fn=fn_1*4!- i$ r! R  I* g
2.程序源代码:  z8 ^& f. a3 X: y
#include "stdio.h"- e* ]. n/ }5 o2 N8 o+ s+ l( n5 N
main()6 V' ^5 L+ \* |# h- D7 ]
{
$ \4 E- t. |4 ?int i;# r# _/ {2 ]4 q; J" K
int fact();
+ B" K5 d* K- u6 ?5 zfor(i=0;i<5;i++)  }4 b" ^/ ?# F3 R- ]8 u
 printf("\40:%d!=%d\n",i,fact(i));+ K8 ~# c$ O3 e  `
}- J: H! M0 n- F- \  V1 b
int fact(j)
" I  ^& T6 p5 v. b# D$ I8 Eint j;
! Z% A6 [8 p  y% h{. O9 ?( V  f" F8 Y) P
int sum;
" `2 Q+ a# W* c) vif(j==0): Q6 y/ ?+ ]+ f5 r; G' i
 sum=1;3 L9 v' U( w- z# h3 X9 l
else+ x: t# B: R$ X( P% }  \! x  b
 sum=j*fact(j-1);2 q$ T2 U, y. K1 i; q7 V6 H
return sum;6 R+ j+ @. Q, E. S! Q- y
}
1 Q" j0 P4 k+ I==============================================================

# A* ^' P  k# I5 @+ \, h* k
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 02:52 , Processed in 0.068048 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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