EDA365电子工程师网

标题: C语言经典算法100例 [打印本页]

作者: dilidili    时间: 2017-9-23 10:07
标题: C语言经典算法100例
【程序1' r: w* q+ i/ |
题目:有1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
6 j" w$ _2 v' E$ J# V$ s' h! H1.程序分析:可填在百位、十位、个位的数字都是1234。组成所有的排列后再去 ! z, W# h3 g- h
掉不满足条件的排列。 6 Y8 Z5 Z. o2 s* d
2.程序源代码: - t9 r+ G' o6 u2 H, U% m
main() {
2 @) ?3 P- R5 A0 {6 O2 Pint i,j,k; # T/ h0 Z# _7 D* @
printf("\n"); 0 `' D+ y7 l! E8 u& O- I
for(i=1;i<5;i++) *以下为三重循环*/   u% v: N) T( W0 `( o6 i9 X
for(j=1;j<5;j++) ' r) F7 }! I# A$ G3 x
for (k=1;k<5;k++) { ' g9 [; i5 m1 k5 q$ A7 e4 h
if (i!=k&&i!=j&&j!=k) /*确保ijk三位互不相同*/ % O" I( K- ?+ D; P
printf("%d,%d,%d\n",i,j,k); }}
- S( u4 y( g4 z0 m! B1 Y8 {. W7 |0 F============================================================== 4 i7 U, D  A$ D* T) O% V. s% ], r# s
【程序2
) w( B. Q, L1 \+ v' e  O, p8 s题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 * [7 g( N7 o( z5 C. M/ r4 M( g' k/ t
10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
1 S  w0 O- z* v' D7.5%20万到40万之间时,高于20万元的部分,可提成5%40万到60万之间时高于 . f. F8 Y; f  N2 a) D7 p' P4 u
40万元的部分,可提成3%60万到100万之间时,高于60万元的部分,可提成1.5%,高于
% _* ]( w7 U1 t3 o$ b100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
& {* d* p2 @/ M, W5 l% L5 k1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 0 D1 N% d' r* V. s+ i( G
2.程序源代码:
/ H( k+ P( u/ C9 Hmain() {
* R% j0 n4 m0 |7 T4 Elong int i; % c5 t0 b" a4 }( ]! y5 B/ O) U
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
8 ~, F( L) a8 a* `  b) F: H9 pscanf("%ld",&i);
7 @7 C6 c' I; }: n4 _bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
7 b9 y6 |4 I; fbonus4=bonus2+200000*0.5;
( ^- _- M& h+ R' z( U% Hbonus6=bonus4+200000*0.3; - G& H, O8 n: {: f! q
bonus10=bonus6+400000*0.15; ' f& E, ?* W. X5 r8 ^& S
if(i<=100000) 7 C! p5 l8 n& v8 L0 \- i) N
bonus=i*0.1;
' Q3 t9 q  t' ], E& Eelse if(i<=200000) 5 W& w6 ^/ g  |- a2 F* K, P$ T( c
bonus=bonus1+(i-100000)*0.075; 5 a2 _4 d6 s# t( G: n. I
else if(i<=400000) 7 U( z; i3 W$ o3 J" b
bonus=bonus2+(i-200000)*0.05; : }& ?% m* Q7 v) A
else if(i<=600000) 6 d! l0 x+ D* Z# c8 h2 X! [8 d5 t
bonus=bonus4+(i-400000)*0.03; ; s4 u. k1 k) J2 @& N; ]9 i( a# l
else if(i<=1000000)
- M( d: n/ Y) O! `# bbonus=bonus6+(i-600000)*0.015;
( O7 a: T! _2 {. E% welse , m% z7 b/ p$ z% v  f
bonus=bonus10+(i-1000000)*0.01;
' I4 i- `  P5 B8 U! I9 W% lprintf("bonus=%d",bonus); }
; o; Q# T5 i5 i============================================================== % A8 J3 H7 g5 p7 I; q
【程序3
# i2 M' i: k7 g题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
8 u' X1 |, u3 \8 B1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
* J2 j. O$ l$ W. v5 R% j的结果满足如下条件,即是结果。请看具体分析: ; R0 g, i1 I; [  t  a* Z
2.程序源代码: 0 V) S9 K7 ]0 m: U9 X
#include "math.h"
/ D# L. Z* c1 H7 U0 smain() {
: d: w: ?; T% n7 olong int i,x,y,z;
; r+ A% p! D1 ~4 Yfor (i=1;i<100000;i++) ; a+ L* {& W7 O0 y4 A
{ x=sqrt(i+100); /*x为加上100后开方后的结果*/
- D+ G' w' `9 x6 L+ L: dy=sqrt(i+268); /*y为再加上168后开方后的结果*/
& S' ?) s5 |2 N. Y$ F1 S8 `if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
6 B7 E% J( I3 r, g  C9 c, Bprintf("\n%ld\n",i); } } - q% Z' I+ O/ A+ A5 B( T) E( W0 N7 V4 b
============================================================== / i: U! D7 e! p5 U/ H1 n
【程序4$ x$ ~6 P+ W6 y# w7 l1 Z
题目:输入某年某月某日,判断这一天是这一年的第几天?
& s9 H) j8 q: Q; R1 S: X( v1.程序分析:以35日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊 6 j6 r: U4 C% ?! a1 U
情况,闰年且输入月份大于3时需考虑多加一天。 ( _  t5 W$ j' M, V' L, x( _5 r5 M1 Z
2.程序源代码:
' n# J/ n3 P- Mmain() { " E! j2 h8 k  ^. u7 ~5 o; V
int day,month,year,sum,leap; 6 ^% Y4 b% ]. G* ~0 z
printf("\nplease input year,month,day\n");
4 Y: T$ s$ K& nscanf("%d,%d,%d",&year,&month,&day); # R- ^$ |+ ^6 z- G, y/ j9 U
switch(month)/*先计算某月以前月份的总天数*/
{ case 1:sum=0;break;
: m2 W! p1 |8 L0 a8 z" @case 2:sum=31;break;
# W0 D/ j" q; z( e: v' vcase 3:sum=59;break; 4 h+ z8 C. I7 V
case 4:sum=90;break; 5 A& l- f7 t2 i# \
case 5:sum=120;break;
+ j! T1 T  _5 _& mcase 6:sum=151;break;
3 I2 u/ P$ `2 N) D. O6 y- ^$ T7 c- g1 Bcase 7:sum=181;break; 9 p, S3 ?) ?  ]! ]! Y* M
case 8:sum=212;break;
- s" q" ?0 Q$ a/ T5 @9 M0 _case 9:sum=243;break;
/ @; C4 U# a8 h8 [case 10:sum=273;break; 8 w  d; s! J) G% F% O. n$ T
case 11:sum=304;break; - _1 N" x, i$ [7 J* f6 n5 o3 [
case 12:sum=334;break;
/ u5 S" A, Q) G% N4 z0 Cdefault:printf("data error");break; }
( [4 f! ^" E" ^( |2 \3 msum=sum+day; /*再加上某天的天数*/ # ?" ~' [' R& e. I5 Y
if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
# u4 }& k; G4 C* U; }leap=1;
2 t$ Y" R; p( E- aelse 9 e6 A9 |7 ~1 Z/ \( k7 o, W" ]! a( U
leap=0;
8 Y" i9 S1 h% Q; s" yif(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/ 2 _! G1 B) P2 W  l% C
sum++;
$ ]* p& X$ B& h4 @9 `printf("It is the %dth day.",sum);} 2 {% }$ v: ~0 E# M; s2 e& _* n
==============================================================
9 v6 r1 E/ \8 z- J( F8 c6 z【程序5) ~2 e5 t& F- u2 Y# B" _
题目:输入三个整数x,y,z,请把这三个数由小到大输出。 ' }4 z# Z1 K( h1 w
1.程序分析:我们想办法把最小的数放到x上,先将xy进行比较,如果x>y则将xy的值进行交换,
- x: i+ L) I2 R然后再用xz进行比较,如果x>z则将xz的值进行交换,这样能使x最小。 : y* b0 S6 Y* J$ C
2.程序源代码:
! r# j6 D9 I: I5 Umain() { % c; z& r* `! i- l% L5 _) A
int x,y,z,t; % {4 ~9 y* w$ ?, E  o
scanf("%d%d%d",&x,&y,&z); , E' g* D/ r4 E
if (x>y) ! g+ F! x" J8 Q/ J: g2 i/ \- f
{t=x;x=y;y=t;} /*交换x,y的值*/
* s# Z: x% P- {$ O# I+ aif(x>z) 6 a: j8 z5 P! Y3 m
{t=z;z=x;x=t;}/*交换x,z的值*/
3 |# w5 Y/ P; Q. O! e4 n0 \if(y>z)   |- I' N9 @4 {/ i
{t=y;y=z;z=t;}/*交换z,y的值*/
! }: b. ?) }; I5 m+ Y  C% cprintf("small to big: %d %d %d\n",x,y,z); } ! ~. M# }2 P5 w0 A

. s8 h; V9 ]) |8 X* A5 l9 A




欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/) Powered by Discuz! X3.2