机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

C语言算法16-26

[复制链接]
跳转到指定楼层
1#
发表于 2017-10-6 15:41:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【程序160 l% J; i# R1 y9 U/ X7 Y
题目:输入两个正整数mn,求其最大公约数和最小公倍数。
- _- C: t# `# Z, ~4 G* f* V8 E- [, D* J; G
8 K4 _- z) N9 x1 {
: |% p' t$ u4 R, y$ s! H
作者: zhlei81 2005-1-22 11:30 回复此发言 ( l' x% e; G' z4 D8 g

: p& a, X- e' y-------------------------------------------------------------------------------- $ S! e0 O6 d3 P$ T2 L

  B+ |0 {) i& x# a! H+ Q! l2 I4 回复:经典C源程序100# [1 l5 c4 f+ ~2 ]' e
1.程序分析:利用辗除法。
' O1 [+ u' O. e1 b' g1 c4 V
8 z: S- Q9 _, j' M) @' ^& s3 C# v2.程序源代码:
$ L3 y8 \; H8 i* e8 cmain() ) P1 `! E: w5 l" j1 L
{ - m, A3 A0 N# K$ g& y
int a,b,num1,num2,temp; 4 E/ Y" B2 w$ D5 N' m3 |9 L1 C2 x
printf("please input two numbers:\n");
* ^% [5 Q/ T* F7 H( i5 i* Vscanf("%d,%d",&num1,&num2); / S7 K  T7 O4 Z# w
if(num1 { temp=num1;
* C4 L, V! W! e, M+ M4 Bnum1=num2;
5 @; {1 J5 K, V5 n! l4 X2 Wnum2=temp; $ g2 d8 B- W" D6 O4 r9 z  k
} 3 P% s9 s+ N6 A8 E( b: l0 T
a=num1;b=num2; + U- Q& W+ ?" G: C) c
while(b!=0)/*利用辗除法,直到b0为止*/
, |. ^7 B/ O% Z0 W{
! J0 S! B) g' j6 ?, e& Mtemp=a%b; / V8 r7 [8 v2 F+ }9 ~6 w( A
a=b;   E; x2 D. {7 M2 x% C
b=temp; ( I( D" j/ C0 s: M& [7 f* K
}
$ [& Y1 C( G5 g; |& N8 mprintf("gongyueshu:%d\n",a); ' s. p5 O, ?: H8 J% T5 }. g
printf("gongbeishu:%d\n",num1*num2/a); : `: o1 b; @; u* e% \- {
}
. g: L. r2 z) O3 r& L==============================================================
2 J; _8 ?+ g1 o& s. I$ v【程序17
6 V+ x" Q2 A. K. B$ o题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
# e/ \" u7 I" M. p  I1 W5 z1.程序分析:利用while语句,条件为输入的字符不为'\n'.
& Y# G# \7 {7 B* Y
  h& g7 [1 B0 F3 d2.程序源代码:
$ t+ [7 _. @8 V) T0 c" }/ y#include "stdio.h"
1 }: t7 M& D/ e& ^9 V$ b  Hmain()
9 z2 d" v! [9 I# Q$ e8 c# v{char c;
" r5 @$ e) G& T1 eint letters=0,space=0,digit=0,others=0; / H! K! N& P( i7 B
printf("please input some characters\n"); $ w0 a/ ~) |1 L  j. ]; O
while((c=getchar())!='\n') / l% }; D7 c" @1 U- v
{ ; ^, Q; u. k8 y# n; x
if(c>='a'&&c<='z'||c>='A'&&c<='Z') * l& B* N6 o% C8 Y
letters++; % j$ A# E0 w/ `
else if(c==' ') - c' G8 u* X8 W7 m6 m1 |( k* f& h
space++; 6 l; O8 |) _9 K9 ?. R
else if(c>='0'&&c<='9')
' d5 \7 d0 K5 e$ Ndigit++;   k0 T0 z  S. {
else 1 r! _) y$ T) Q/ Q* m6 g
others++;
8 d9 Z8 R2 ?" u5 i# ^% a# K: T}
* f  y- _) V2 |# C. m# {! s& }printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, 0 h5 k/ W$ }9 O- |* _. S- I
space,digit,others);
) X. b5 ]) M; a9 k) A& M} 1 v* o7 W1 J; Q3 }
============================================================== 4 v/ L! x# x# \/ u+ F8 G
【程序18
3 h- ]" N8 m# B题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
' L+ G2 _/ h4 S共有5个数相加),几个数相加有键盘控制。
; K3 o0 j" R  b1.程序分析:关键是计算出每一项的值。 2 x& Z& B9 @! ]5 D( U
2.程序源代码:
1 {8 n: T5 A" ?- |4 u- \* }main()
/ B: R6 N( C" |" J- ?3 Y. |{ 0 b+ m9 u2 B9 f1 j
int a,n,count=1;
4 o0 E# n0 O* E$ L3 wlong int sn=0,tn=0;
. g9 [8 p8 w! l# C. b: {. [printf("please input a and n\n"); ; r+ e7 ]% A" S) k* [- c) f
scanf("%d,%d",&a,&n); 5 |8 p! a: |$ [% v7 k
printf("a=%d,n=%d\n",a,n); " n! Q* u% p- y- M$ E: N
while(count<=n) " n8 j& i9 i' Y+ H' V5 Y
{
  y; W0 E; }& N; C! o* E5 Jtn=tn+a;
: v6 \% t9 W3 ~" ~sn=sn+tn;
9 N5 p* M) t) X% L9 `a=a*10; - O0 v- q& j+ F, e; m* E$ f2 m
++count; 7 z9 r  ~: b& m! `6 G, I8 T
} - ]/ O* A0 b: Y9 c! U1 _0 ^& ?, A
printf("a+aa+...=%ld\n",sn);
# ]9 R7 i7 r5 z5 {: O$ U} 4 p/ ~0 h, {+ @* n( v& c
============================================================== " n1 J% Y( b- A  X' O
【程序19) f" ]* T- c% e# X/ v& @- ]
题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程
4 J# r- N1 I0 s$ z5 {0 x找出1000以内的所有完数。
8 q9 B) v8 D: A# ]& y1. 程序分析:请参照程序<--上页程序14.   i* I+ P6 H% M; D
2.程序源代码: / R; n. q7 K  X$ P0 p
main()
* q# K3 i, l" O+ k! {: H! x{ ! E8 N; |% G& D
static int k[10]; : z; G# J# n8 o1 O9 {
int i,j,n,s;
1 C' k  T$ R. L# S& ofor(j=2;j<1000;j++)
' E) N, }& S) q9 Y{ * n1 m: {1 r1 T# E1 j  c" P
n=-1;
5 s3 Q7 c. D& ss=j;
( y' m6 H: o4 M: g# w4 _3 o; V# l3 qfor(i=1;i {
! ^2 C3 A( t# z  \if((j%i)==0)
4 ~. |/ Z3 M: a( `{ n++; / O- v2 w2 q: p$ S
s=s-i; 8 y) a: |# R8 _* L: \
k[n]=i; # ^) V* i  o# \% k4 O1 X
} & }/ S4 M) d) r: `2 o/ O! F! m
} 6 F6 r' a7 U6 C6 m0 \2 |* T$ h$ `
if(s==0)
! ]3 }$ P# i4 Z' Y$ ]* V' d  |{
: |2 I* m- E& E( V4 Uprintf("%d is a wanshu",j); # ]2 g1 E/ E& N2 c$ |: v3 a
for(i=0;i printf("%d,",k);
# E0 U& c1 y- ?9 v' }$ jprintf("%d\n",k[n]);
. \" C  O* V! S, `}
' v# x! O" K2 m( H1 [}
) I, p* D7 t$ k" k6 J6 p" h} ' `' c; l- B4 L4 _. y1 U& g* X' S
==============================================================
/ k: j) l# h, T" M# n【程序20
/ D, Z: ~& U' {: v9 J1 E6 w题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 0 o4 l; p: T# _
10次落地时,共经过多少米?第10次反弹多高?
, [, q; T- [( B& P1.程序分析:见下面注释
4 _5 y3 H6 ?$ n8 o; w2.程序源代码: 0 g5 Y) Q& ]3 e* ]; B* x- W
main()
. J% ?8 _" s, t4 Z{
/ |/ W3 Z& [' Jfloat sn=100.0,hn=sn/2; - I; f' S* L' A: T* d7 j
int n;
) |! [9 E4 ?8 D) s0 @; G, Mfor(n=2;n<=10;n++) . _. D3 o6 e9 q# q( k: H
{ # z- n2 @9 A: L+ x! X: O! c) F
sn=sn+2*hn;/*n次落地时共经过的米数*/ + a8 X5 j- q1 g# x8 t8 c
hn=hn/2; /*n次反跳高度*/ " q7 q5 m) |( \0 h7 v
}
) n1 O7 W2 @$ B5 @$ Uprintf("the total of road is %f\n",sn); 2 q3 C+ O+ n; p( z
printf("the tenth is %f meter\n",hn); $ F& X7 {% R* B8 z7 @- L+ n  N
}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
' b3 k8 Z/ H! M- O8 O   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下! {9 b9 b: W# Y7 f  P
   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
# t6 ?% d/ v- k6 u6 f1.程序分析:采取逆向思维的方法,从后往前推断。
% x( L4 L* y. v: ]/ r3 Y2.程序源代码:
* K3 c+ q3 v. L. ], Omain()
% I$ A* C( {, z{
% q) e. s6 H5 ?; ]& gint day,x1,x2;& L0 T; \* z6 w$ M4 _% K
day=9;# O! ]' a! s7 |
x2=1;- H7 z$ r5 }( I* J
while(day>0)! H+ @2 a; @  G) r
 {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/0 ^% U' d$ T& |5 a
 x2=x1;: P/ h7 q1 J& P* |( x- w7 Q9 _
 day--;
1 _1 a, U6 q0 W" x1 Y  s }/ q. H/ i/ _2 t8 e' ~7 H$ @- Q
printf("the total is %d\n",x1);6 g: z8 d. |, C' T9 h$ Y8 R  i7 {
}& C$ {0 T, O. R, |/ R* ~, A! q
==============================================================6 f. ?4 c. S( d
【程序22
/ O+ M) j) Y: y8 @$ \2 B0 [题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定: J" V) M& ], Z1 s; W! Z7 e" ]1 j
   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
2 a" _6 b- a+ ?   三队赛手的名单。
5 G5 I4 {# \8 U4 T& `1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,% r3 T4 T5 J0 Y. @% Z% G
      则表明此数不是素数,反之是素数。       $ z, }# C0 B# @3 S0 y
2.程序源代码:
& K$ h# ?% o; m+ A; R4 C0 Rmain()
& u$ L" q. Z& q6 x! P{" }6 M  d) W- Y1 A, G6 r8 e& b! z
char i,j,k;/*ia的对手,jb的对手,kc的对手*/
! r/ H' ?# ^5 B& ifor(i='x';i<='z';i++)1 Z% A8 _, Z- s( X" U1 a
 for(j='x';j<='z';j++)
) V; _1 D6 @, V1 o {
* v+ A3 y3 ?, n6 C  u% N if(i!=j)
& t6 ^* ?1 V3 _, j  for(k='x';k<='z';k++)
! i! m3 t! ?* t0 C% V  { if(i!=k&&j!=k)
  `/ W4 T" J/ K   { if(i!='x'&&k!='x'&&k!='z')3 j6 z  W+ L( P, F
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);' [% N9 L5 Y$ h
   }- L. X# `, E: M
  }7 [6 x) Z0 X) T
 }! G- U" y" q% M8 Y3 b( L: j
}5 j) l! w/ N' S9 D
==============================================================
: x7 x8 s2 s5 o【程序232 g& F) ^) p0 D* h3 e2 Z
题目:打印出如下图案(菱形)
*
8 K7 l& N0 K. q; }***1 Y7 j9 U5 d  j: ~, N6 U6 g
******
  o/ k7 e  f* r" f. W# @2 ~********
, N0 S) X7 N  u& p******" K. D7 O/ Q/ L$ f+ ~' K, A  L
***' r3 L( C0 k& h+ r2 t: }
*  a5 O. S# e: f" u. F2 z5 ~
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重6 [* k( ?/ J4 e7 e+ J8 B. D1 [
      for循环,第一层控制行,第二层控制列。
/ g: g5 r3 }6 a! B7 C) G2.程序源代码:  X, Q$ {6 r/ R6 L# B( v
main()8 W9 n" J* P* ?1 k2 k5 h$ @3 t
{
# {/ `8 P6 R( P- ?int i,j,k;
! @* A. @' P7 {+ \for(i=0;i<=3;i++)
6 s+ b* w; o4 D% r {
- H8 N( K1 ~3 p+ w for(j=0;j<=2-i;j++)% _: U" D) L5 L& `# x7 r
  printf(" ");: ]1 ~  F% ~/ u( ]; b7 v# x  ?7 o
 for(k=0;k<=2*i;k++)
( m/ \, H+ r4 T8 x, G3 W# U  printf("*");
2 F8 [" c; P4 |3 Q* ] printf("\n");
& {* }; t( ]5 {+ U) y: T) q) S }0 u4 v$ Z1 h! g
for(i=0;i<=2;i++)
6 }2 C4 R0 z8 ~: z/ t {
) B8 p  O$ p; s5 {& o. j for(j=0;j<=i;j++)
4 }/ |% g. G# [7 o4 p- [  printf(" ");3 A' o! M. n* N* B; b( \
 for(k=0;k<=4-2*i;k++). F9 O4 g6 U' n' J% m' B9 U
  printf("*");3 w* q3 x7 t1 z( s
 printf("\n");
/ }: x" x$ I# f' u( [ }2 e$ b) E+ u, `
}8 N, \2 R! ]. T1 y1 [, \; |' b+ d
==============================================================
, k9 z0 j: ?, a* P1 u- w7 t. |【程序24
# T3 v, }; c3 m" A6 I, x7 T1 }题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
9 m  i, P6 `, Y/ ^8 D1.程序分析:请抓住分子与分母的变化规律。
$ O7 j9 W; I2 v3 k& e7 }2.程序源代码:" u, S( b6 a7 ?' g: ]$ M6 P5 s. d
main()
' E0 F- v3 b" B{3 t" J3 G+ `1 G) q
int n,t,number=20;; I) Y9 @% M# P" M
float a=2,b=1,s=0;! z. m( [- K+ {9 r: E2 }! K9 B6 {
for(n=1;n<=number;n++), g4 ?) ?" h* {! B# \- n6 p
 {4 ?  z! Y7 y% V* y, e" z
 s=s+a/b;: z; p3 d# c" D# k
 t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/6 ?( \5 ?7 E9 ~" A
 }
0 a$ ]$ M( [+ i2 Kprintf("sum is %9.6f\n",s);) U( D; X3 L: G  i1 F7 l
}# w7 G: j! T( B6 A4 I. y
==============================================================" N( d+ y3 V' Q+ F
【程序25嵌入式学习企鹅要妖气呜呜吧久零就要
! u+ y! u" S" \4 K* \9 `  Z题目:求1+2!+3!+...+20!的和, [0 Y. Y0 b: o4 E2 W* z
1.程序分析:此程序只是把累加变成了累乘。
+ x5 ^2 |4 @; ]+ F% x1 ]2.程序源代码:
7 S1 E! w+ E+ w( K) e( ~main()
! D% O0 t8 h2 Z9 V' \$ F{$ y; U; N$ v7 n9 |0 u0 m8 {: ]+ j
float n,s=0,t=1;
7 l" [/ r. E; C1 D% Z9 Ofor(n=1;n<=20;n++)( U0 P! h7 z! R5 M( [
 {' O& W. }1 J4 C6 `% ^
 t*=n;
+ x# f% P5 Y: I6 J s+=t;
( w( `/ Q2 q- V: d( C }
$ B  @7 s2 B# N7 s7 pprintf("1+2!+3!...+20!=%e\n",s);
. t7 v2 r4 z# ^4 M# X; z8 J6 S}( I' f: T  g6 B1 _" o! ?* ?- B
==============================================================/ ?; k+ ?' T" ~( t* x+ r
【程序26$ m/ m1 z- x1 @, N6 d
题目:利用递归方法求5!9 U) N4 P5 x' P3 s7 q
1.程序分析:递归公式:fn=fn_1*4!
' A# ?7 F5 B! d* H, g! V2.程序源代码:
# Q6 G! X! A: g% B6 h#include "stdio.h"* j* g/ s+ G% z7 y8 v0 B# Q! |
main()  k5 C& j' L8 n+ z9 b
{
) C7 ?5 ], u8 |( |int i;6 w% ?- Y% s: C" [* F( k1 w
int fact();
% y! ^2 {( v' F+ o1 r4 H7 Z# x& Hfor(i=0;i<5;i++)" \" \! C8 J6 j! G0 M
 printf("\40:%d!=%d\n",i,fact(i));
% P9 r2 z' {1 K( h}3 d1 V! C* a  ?) E/ s- e4 ^
int fact(j)" X# i1 _& y/ T+ `3 X
int j;8 Y: p9 U: R3 P2 z4 f/ I
{
* P) Q$ i5 A8 Fint sum;
# u+ F  c/ ~  Y; y, F* n6 \, qif(j==0)
7 l  s" H3 j) o* c/ ^! M. z+ O sum=1;
; K$ E3 a7 Y4 F7 xelse
5 X1 |. D3 a; ?! n( G sum=j*fact(j-1);
9 p3 G) {9 V: s8 wreturn sum;
8 d* x; Z' R" ?9 ]}
5 M6 b5 X$ I0 F0 x, A==============================================================
' W* l1 B' ^9 C8 K# m
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-10 02:21 , Processed in 0.051490 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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