机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

C语言算法16-26

[复制链接]
跳转到指定楼层
1#
发表于 2017-10-6 15:41:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【程序16
$ O; B3 a& w( {- r0 G题目:输入两个正整数mn,求其最大公约数和最小公倍数。
# a' k. g% p( d9 K, q6 Q- @( t* ^' g- J+ Q5 v3 F! |/ g3 j$ @
2 A4 Y$ Z5 c. P/ U7 q: n$ c" l" N
* N" F6 H7 u1 X; K
作者: zhlei81 2005-1-22 11:30 回复此发言
7 n6 N4 f5 ~, ~8 K) u6 T% t5 o" e* f
-------------------------------------------------------------------------------- 2 C" ^& {' |3 i0 |
, m! B* ~: {- D0 q) N: {  j
4 回复:经典C源程序100
  ?7 A2 M1 r8 ~& [: _/ ^/ j1.程序分析:利用辗除法。 8 T  W' f! g# A  Q& o/ e

  V$ v2 w( C7 v, v1 x# q2.程序源代码: + z0 F0 }- m4 G* F' r6 p- q% [
main()
, A- M' `5 v+ U5 q9 A$ \( f+ r4 N{
8 M, e6 g! J1 Y! m8 I+ _, pint a,b,num1,num2,temp;
6 W+ Y. {) c- |. L1 u) R' uprintf("please input two numbers:\n"); , w* j# v( ?! V* \; C* @) W
scanf("%d,%d",&num1,&num2);
% S2 m8 R$ k3 f! Oif(num1 { temp=num1; 8 W4 m5 P0 P: x$ q: o7 C4 A( u
num1=num2;
- v# o" R  t' I$ {4 l( I5 T, wnum2=temp; $ ~' G; K2 m: N9 E* G) U7 Y8 `
}
1 K/ P# F  V, J2 L9 Ba=num1;b=num2; 0 c) y& T5 o& ?" J' A6 z' o/ ?& u
while(b!=0)/*利用辗除法,直到b0为止*/
1 v% W% x" O: j$ G) G8 e{ ' u  O/ f" H5 G
temp=a%b;
3 g. i4 q! S1 G& I0 V" V- e, L# Oa=b;
4 a* `" }7 u6 Z! o2 F9 U9 _b=temp; ) L8 I7 Q$ h( ]" G: h+ W
}
# }5 ?1 ~( i2 k; G3 ]printf("gongyueshu:%d\n",a); 7 N* p: K6 k1 {& v
printf("gongbeishu:%d\n",num1*num2/a); & c: G) t9 W" R) X, ?8 Z6 t& M
} - ~# J+ [9 @- u) C% J
==============================================================
4 M2 p0 k+ }- [& L; \9 x【程序17
3 j9 o5 }2 ^8 U* D题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
! m) C% c* h, g! |1.程序分析:利用while语句,条件为输入的字符不为'\n'.
: R" |; O- ~$ E9 v$ J# p5 e+ V3 X7 @9 W% [" c  _
2.程序源代码:
& ^" w1 e7 y% N. x8 f; b#include "stdio.h"
7 V1 g2 }# O) {' f/ q8 @: k. cmain() 0 g! N) o3 F: x! ^
{char c; ! d' q: V$ T5 V+ r7 d* h$ q
int letters=0,space=0,digit=0,others=0;
9 g) ~/ d1 ]5 V4 ~( q8 N0 Lprintf("please input some characters\n");
; g4 w2 c# @% N. T2 o% Jwhile((c=getchar())!='\n')
# Q7 [! K; V9 k- r# g! R% S7 i{
& Y6 C; [+ {8 O6 ]2 ^if(c>='a'&&c<='z'||c>='A'&&c<='Z')
( N8 s" G$ s, Hletters++;
% _) [+ i6 ?% i9 A9 Relse if(c==' ')
0 ?5 p. i! g0 j% Cspace++;
! k" @8 N: n4 w0 w7 [& Ielse if(c>='0'&&c<='9')
+ [7 v9 P. ?$ t* hdigit++;
  F4 T, X( ]! Q( J1 selse
. k  C% s# H. c' M$ I, N( m8 G& h- Xothers++; + @% k$ Z: |$ X% v- M
} / i0 {* T% ]: R) d- @
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
5 ]- `( U- G. m) S, L% U' dspace,digit,others); ( f# W* C! S$ n& W, P- a
}
8 J8 \' r6 w2 X6 }" P/ D- J============================================================== . [# }/ `9 t+ l7 @( }/ Y
【程序183 u# d' \& H) e% k" X3 A
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时 & Z( P4 x, p+ z+ m% k( i7 Z% V# N
共有5个数相加),几个数相加有键盘控制。
: C5 X) Y3 X, {1.程序分析:关键是计算出每一项的值。
1 |; u8 H. h9 o4 t# j7 O2.程序源代码:
6 P7 A6 G5 o# t6 H2 Imain()
0 D$ S) g% N! y5 ?{
# C6 V% M* B0 ~. v5 x; ]* j$ Wint a,n,count=1;
3 B5 k% Y# w+ v9 R5 _! ^) M' A4 X8 `long int sn=0,tn=0;
( }0 F1 E+ f5 V6 K# \printf("please input a and n\n");
- W! l( L+ l' t9 s# L. @6 Rscanf("%d,%d",&a,&n); . \, s! E) K4 w
printf("a=%d,n=%d\n",a,n); ) q5 r4 @7 ]+ \  i
while(count<=n)   ?4 z8 Z% Q* i7 K
{ 9 P4 w: B+ v; a
tn=tn+a; - d! z$ d1 I9 S( U5 T3 p6 Z9 a8 K
sn=sn+tn;
) d2 s( ~" m; g$ s% p$ R9 {3 E2 sa=a*10; & Y! h: E$ M5 M2 B; T
++count; 1 ^3 R& n! K8 q* U" Q7 m4 Z- q1 U
} 1 w6 g9 O- D1 m  ~; Y% ?/ L  g
printf("a+aa+...=%ld\n",sn);
8 s2 F; W& V  W/ z/ _} 1 {) v" r# G/ y. ^) _3 n" h
============================================================== " m: s8 v# J0 P- r- ?
【程序19
% @) I: o4 Z: W( i题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=123.编程 / z  O+ u: Z7 V6 I9 d
找出1000以内的所有完数。
8 F2 d) w" Z% C( \6 `6 V; S* I1. 程序分析:请参照程序<--上页程序14.
  n5 N/ e- e( ^8 W- ]2.程序源代码: ( z! o! Z5 l; A
main() ( ]2 F4 A6 H9 |" @- A; Y: H) x
{
! }' N8 V7 c, R+ U: E% }static int k[10]; 4 S7 l& s4 T6 F/ u5 y- h. q+ f* [
int i,j,n,s; ; C9 N: G6 T' c: O: `3 s0 z
for(j=2;j<1000;j++) ! r- {7 U; Q5 J( J! C
{
$ d$ T1 z3 J2 En=-1; ( G; v3 |: H3 H8 V. c0 d3 N, ^  f
s=j;
- O1 z2 S/ ~' a  Yfor(i=1;i { ) ]2 x, I* |  d9 E+ M+ I
if((j%i)==0) ! H; b& S# d2 Q3 h6 |) z1 |
{ n++;
( ^, d% N/ Q7 W& X& }* |1 fs=s-i;
7 W" {$ c) l+ I3 u- e; j  P% u: r: xk[n]=i;
+ e8 Y' c" ]" R* `2 s# N; b  `}
/ ~$ e4 C( {" ]" {0 y/ h/ X} 8 w1 g$ k! G2 \7 K1 V
if(s==0)
8 G$ E% _0 p( M{ 6 Z9 s2 c2 H7 C. a& s( t$ b, T
printf("%d is a wanshu",j);   W2 C! Z3 P' k0 S" @! H& C
for(i=0;i printf("%d,",k);
% ~' H2 z8 |  s& ^printf("%d\n",k[n]); 1 ]! U" q, U& I
}
# V) b$ ]4 H* x  j9 Z4 E" T}
/ r* c# P# _. t! G3 v* ?}
! c- g+ f- w: ~' ?' b3 w( o0 x: i7 \============================================================== ( G( K* T; ~; M$ Y4 B0 T! w( V
【程序20
( R  r  {+ }' b  G. v题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 ; @+ G& ?2 {" y2 D) q  p
10次落地时,共经过多少米?第10次反弹多高? 3 B) G  {2 W$ d. q' }
1.程序分析:见下面注释 4 g+ H* Y( Y; F8 g
2.程序源代码: % F. D+ e+ q+ U/ N
main()
/ m: j- y( R- R' P# L  n/ y  P5 u{   q- h3 ?: J4 a1 `
float sn=100.0,hn=sn/2; * _: z0 J. S9 ]
int n;
/ B- r+ Z6 u& a: Ofor(n=2;n<=10;n++)
1 o2 F. [+ Q6 ^8 b) P; |8 j' d{ : j  Y/ V" H( Q) f) E2 B
sn=sn+2*hn;/*n次落地时共经过的米数*/ 6 f4 a* h% B" r* K/ A: ?6 ^
hn=hn/2; /*n次反跳高度*/
$ m' U# O. e0 o8 ?+ ]* Z1 \, |" ~}
4 h! M4 Q1 Y, h$ W2 yprintf("the total of road is %f\n",sn);
3 d; `0 [, @% n' n7 }& @8 y9 Gprintf("the tenth is %f meter\n",hn);
, |6 n# A# p- E7 x% I}
【程序21
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
7 \% U2 b, e7 K7 f# {7 a+ O   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
8 {8 T4 A" G  X( Y! m( H5 h   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。: ]( f% D1 K, ~3 ^
1.程序分析:采取逆向思维的方法,从后往前推断。
' D  ~, O' L1 T0 o; n2.程序源代码:
+ i4 B: q. Q1 S/ T3 ]main()
7 Z, Q% J. q# G7 l{
- T  @3 K$ E* E, W% O( }int day,x1,x2;
4 l8 W3 m# s2 i3 y& k6 g; s4 k5 Gday=9;
! t. ?6 j3 g" d  Bx2=1;
  O# j1 f" Q# K7 P9 x0 uwhile(day>0)( C) k$ W- g& L1 {+ K3 w9 ?
 {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2*/- b$ l2 P; s3 G2 K; k: {
 x2=x1;8 s0 t5 v8 z. Q+ ?  k* }2 @
 day--;
: G2 m4 b$ t/ f  t/ i6 ` }
& c5 T1 r; ]' g- lprintf("the total is %d\n",x1);7 J9 z1 L3 @6 ?0 ~- h
}
5 y. j/ \! i7 r* L, R! f==============================================================
% {: s* @2 D  Z9 n' b【程序22  c6 [0 A7 _9 F- S0 c1 n
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
( ?5 ~3 G) z% s9 ^6 r- n8 l   比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出" B0 F. _0 K3 o" T9 m- z
   三队赛手的名单。
" K& q$ t  Y) f" h3 O1.程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除,
" A/ b2 g! v$ K      则表明此数不是素数,反之是素数。       
, u+ ]* U/ c+ |4 j2 J1 h7 G# X& [2.程序源代码:. r  |2 O- N) `* Y5 O/ `
main()5 T! R0 e. [+ B5 c4 X. o
{' d; J3 ?# r6 J; s* ~8 S4 p
char i,j,k;/*ia的对手,jb的对手,kc的对手*/
4 j# T2 @8 z; w* ~for(i='x';i<='z';i++)
8 \' p- e" t7 A- q( X: H; r9 Y, \5 S for(j='x';j<='z';j++)2 O, ~, f& |7 E9 S. ~0 M
 {* D* p4 }2 |7 N6 T4 R
 if(i!=j)- i) _" @/ t$ r  [- u7 J
  for(k='x';k<='z';k++)
/ u# S6 h( `; T3 I  { if(i!=k&&j!=k)4 `" p" g4 ?3 ~2 c; Y* m4 g' x
   { if(i!='x'&&k!='x'&&k!='z'): d# p4 ?, }' n$ `
   printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
7 F$ J! V$ {# J8 C   }
$ d7 |3 G+ W. l% L) w  }
" D/ F0 d, ^  x }
/ f5 K7 p% ~' s2 r. w$ T3 V}$ x+ Q3 x4 q2 h
==============================================================) u7 S- B5 l7 @* ~
【程序23; D% e) _7 F  q. P
题目:打印出如下图案(菱形)
*. U; P# a( c; k$ F
***
' Z/ u7 _, X$ f. v4 j# X, {******
0 H& y& w' _/ {1 R9 s) B********
. S: C) A7 o5 b& N! V9 c3 l3 \******
. A* y: h3 U1 C1 ]6 [***
& g1 N/ r0 I* n& d; d$ c7 J*, Y/ [$ x+ R5 I  x
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重
- C3 y4 e' H. A4 L/ h      for循环,第一层控制行,第二层控制列。
8 d; a7 |( C8 o  ~7 n' D2.程序源代码:- g+ c2 P3 T! d! j
main(): |2 _1 j; K3 P: K' ~
{. I7 n7 ~( D- B/ H% t' O/ k
int i,j,k;3 E) _$ s) @- r+ X3 r7 ]
for(i=0;i<=3;i++)! g) j3 ^( z, {4 Y  C. V
 {* w! g, |0 r0 t- J9 y
 for(j=0;j<=2-i;j++)
  X- v8 C' D* _" T! m/ i  printf(" ");6 w3 K' [# }% i  @( w& \
 for(k=0;k<=2*i;k++): D0 `: E) R! n- {' [" R; _! b
  printf("*");/ u4 \' r4 a* r* K/ Y+ T! F5 H
 printf("\n");
. A/ j# s# n4 ]$ K' q3 V }
! L% l5 v, Y* n! z: q& v% |for(i=0;i<=2;i++)) R7 S, E8 r9 c1 a% L" M- Y
 {
4 l0 V4 }) [6 m for(j=0;j<=i;j++)
4 }0 _( k9 m6 ]0 u  printf(" ");) d0 g) \3 m: U
 for(k=0;k<=4-2*i;k++)9 u+ H2 M& n# h. j$ P
  printf("*");8 b0 K$ v9 k- e7 g5 q/ E5 w
 printf("\n");
: z/ A* M) u! u% K- |. V }
  k! |  |$ @" N( @8 D) L}6 @  |/ r* m8 q' b5 l/ W  R
==============================================================
* y0 V% }/ d5 S- A; s7 \* \  g【程序24
- G+ E% N' ~: q) A, T题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。( ]9 S- C: X2 t( X- G- J5 w
1.程序分析:请抓住分子与分母的变化规律。
' Z, G# m9 j  a6 J3 U' T2.程序源代码:  p2 l# B% V+ F5 L9 t
main()
& I# G5 M; L9 @* ~  {/ ~# ^{
2 d5 E5 ^5 a8 E9 Q. Lint n,t,number=20;. m+ o9 k. S$ k. O' N: V8 X
float a=2,b=1,s=0;
4 x% W# l! F6 H: S2 M$ ]for(n=1;n<=number;n++)
- Z  u8 C1 T6 m {! `/ D  C* X* e; b' {
 s=s+a/b;2 `! N5 F" \/ E2 u$ E& Q  I
 t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/* t* r- P1 j! y' d
 }8 O" H; {0 G/ h* V1 x! C  b. f1 r1 O
printf("sum is %9.6f\n",s);
  h3 O' h* U4 T. \4 D}
/ @1 i( s+ p  e1 i==============================================================
9 q/ |& u/ i0 U6 E/ I0 U【程序25嵌入式学习企鹅要妖气呜呜吧久零就要& v# B+ j' J& [8 W
题目:求1+2!+3!+...+20!的和: K5 ~* Q3 R8 L3 p' g0 G# l
1.程序分析:此程序只是把累加变成了累乘。
+ a& F, u# }6 l+ m2.程序源代码:
* H7 Q: v* `" Y# l' `main()
6 p( b1 c* f0 ^4 V( [{2 \+ q$ v3 r0 m3 x
float n,s=0,t=1;
3 r. C) R/ y) I0 |/ S* ^6 Kfor(n=1;n<=20;n++)
) e* f' [1 G2 H' ^& D2 @: U {
8 B  r" G9 [4 \: C# ^- I, } t*=n;
3 @, Q9 B% D5 [  `! ]6 y s+=t;7 e! z& W8 x1 j: i5 o1 |3 C
 }
& \+ x& _- R' m3 b, Wprintf("1+2!+3!...+20!=%e\n",s);
8 z0 E* D, n! u2 @3 d7 C/ w}' s4 v4 ~' z7 L# m* N3 n
==============================================================' @" C/ i: K$ E/ R: a
【程序26
$ s9 `" \$ ?8 Z% d3 Z题目:利用递归方法求5!
/ \3 P& A1 {$ S( z  ?1 p! D1.程序分析:递归公式:fn=fn_1*4!# U" W5 J8 m3 D- Q$ ^* Y! ?; Z
2.程序源代码:
/ E1 `; r$ d) Z! n1 U2 x' r#include "stdio.h"! z" e. N8 I, \6 O' Q3 Z/ H
main()
" v) l' t( z9 ~{
" N; r9 g8 t2 I: u  e" y0 M" mint i;
1 t/ ?- L# k; v9 ]+ {2 Rint fact();
" I' e5 M7 q* Y+ W0 s) @for(i=0;i<5;i++)
8 B, v( I$ l" f2 V1 W7 [6 D9 F) c printf("\40:%d!=%d\n",i,fact(i));
. {! M: a0 o! L+ d: E: q5 L( N}7 Q# j5 z0 J$ c
int fact(j)8 W( O' ^. B7 x( e. e  E
int j;
) a0 H* L: m* l9 {+ s{" L) P/ V, j- x# i8 Q  q
int sum;
2 a2 f: B  L6 P$ R: B" aif(j==0): g* U: B: q  F6 C7 t8 _
 sum=1;( z  K- k$ g" M. z1 E1 e
else
9 D8 j. }* @0 o  m5 W) D% Z6 ? sum=j*fact(j-1);6 d) K0 O3 t) ^+ ?( a' q
return sum;0 r: G0 D! ?% G. ?* Y
}; Q! P0 ?) Z9 g- r
==============================================================
+ L! A8 V. `$ g
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:44 , Processed in 0.057248 second(s), 13 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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