EDA365电子工程师网

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

作者: dilidili    时间: 2017-9-23 10:07
标题: C语言经典算法100例
【程序1. b& {7 y8 P7 H4 K" m9 D$ G
题目:有1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
; G4 Y% m7 X8 S# y* b( f1.程序分析:可填在百位、十位、个位的数字都是1234。组成所有的排列后再去 2 M  Q- W: p' i/ I
掉不满足条件的排列。
/ \1 @% H7 H3 _2 i# W* c+ |) x2.程序源代码: 3 e6 G$ @7 q# S0 O/ B' u3 q
main() {
7 L! i' r9 e' k7 Fint i,j,k; ( u: V. t" h' }. a8 p& Y6 E
printf("\n");
" \$ |, x9 k1 o8 e7 v: \/ yfor(i=1;i<5;i++) *以下为三重循环*/
' N9 u4 l: G' b7 h- Kfor(j=1;j<5;j++)
0 o$ t3 ?5 J9 Z" W7 H0 cfor (k=1;k<5;k++) {
- ~* g: W+ [- I* u( {& Hif (i!=k&&i!=j&&j!=k) /*确保ijk三位互不相同*/ ! J: f# x: @3 z& c
printf("%d,%d,%d\n",i,j,k); }} 3 K# _: q  Z2 e& ]
==============================================================
+ X6 Q3 w2 i) e1 Q9 ]【程序22 n0 H9 k9 q/ N( C
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
; M6 ^7 @7 j6 J+ y: r: n3 |4 h10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 : i% ^4 r* {6 m# s8 X) H
7.5%20万到40万之间时,高于20万元的部分,可提成5%40万到60万之间时高于 & R/ R, {1 T. n' ]
40万元的部分,可提成3%60万到100万之间时,高于60万元的部分,可提成1.5%,高于 & T+ ]* k- `# T) R
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
- A9 N# N" r/ n$ i; |8 F* U, X. z1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 8 ?, p" {/ R* {& g
2.程序源代码: 9 y; T  u+ n) Y# W
main() {
6 Q/ C- {( m0 G: U4 Along int i;
9 K0 n  j1 X9 v( ?int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
5 V; D1 f8 V: j- n! X& }scanf("%ld",&i);
, n: C: G2 T7 Z# D$ ~2 H8 H& Kbonus1=100000*0.1;bonus2=bonus1+100000*0.75;
8 b9 Y9 C) d1 J7 h+ p; mbonus4=bonus2+200000*0.5; 1 Q, y2 I5 Q/ t# B/ J  H* V
bonus6=bonus4+200000*0.3;
; z; f" Z" f2 s' U# R& R) Wbonus10=bonus6+400000*0.15;
- R- S; w0 u9 `if(i<=100000) / _" S( u* m1 {0 Q% f/ S; I
bonus=i*0.1;
! ?% O" l* A8 D8 L. _$ Q- e  Velse if(i<=200000)
  a% ?1 V$ b7 F9 S7 \bonus=bonus1+(i-100000)*0.075;
5 Y2 h/ B  Q6 O* {else if(i<=400000) ' g/ k/ e  S3 c8 P( r/ `# P* k
bonus=bonus2+(i-200000)*0.05;
" I8 K: b2 V* {( e3 `( Belse if(i<=600000)
) S/ k: h$ E! x6 ~( f: fbonus=bonus4+(i-400000)*0.03; 4 x3 c% C% g/ `1 a4 C0 R1 {0 W
else if(i<=1000000)
# T- r9 G* Y, e9 U7 a, J, c" ybonus=bonus6+(i-600000)*0.015;   K7 r( T1 H' N' J; D/ P2 b# M
else 8 M, ?9 r( x/ Y: R7 _+ J5 `7 S  e
bonus=bonus10+(i-1000000)*0.01; 0 K, ]9 ?0 B/ }7 l, O( t+ x0 j; v
printf("bonus=%d",bonus); }
  ]7 E. ^% W3 |6 X============================================================== 4 x8 V( k3 Z' L# y3 u9 n
【程序3
/ W+ }4 o# I: k1 O% ^题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
- ?; Z' W$ o% Z% p1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
% z- B9 W+ `. Q的结果满足如下条件,即是结果。请看具体分析: * h+ |& U# J: `$ U& @# e+ L
2.程序源代码: ) w! _2 |0 X3 J* Q9 u- N8 ]
#include "math.h" 1 b$ T; c  t0 M2 x# S) V. a
main() { ' G% ^& w% T& K' B) Q6 A  Y7 n
long int i,x,y,z;
& Q; _  M6 [; V9 W% afor (i=1;i<100000;i++)
* T2 E7 ^4 |/ Q( U{ x=sqrt(i+100); /*x为加上100后开方后的结果*/ : J  \* X4 _$ Q$ g/ Q4 Q
y=sqrt(i+268); /*y为再加上168后开方后的结果*/
- r' m$ I7 ]9 U& @) \; K* Aif(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
% p" t8 i" |. Fprintf("\n%ld\n",i); } } 8 f' |, z7 Q- k6 ~) ~2 s) k( ?
==============================================================
5 y0 k9 L: D9 \& H3 M" V7 C【程序41 u; K5 b9 t' ]. t: L1 o' b
题目:输入某年某月某日,判断这一天是这一年的第几天?
3 X" v- p% H0 I: ^: q* p$ S1.程序分析:以35日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊
9 Y0 N8 g) F& N; a/ G; d" f情况,闰年且输入月份大于3时需考虑多加一天。
# v/ K5 ^! t& Y' c. V  O: J2.程序源代码: 7 {( Q- u4 ~. |& B3 i* g- J
main() { * h7 x) r  L3 s; ]8 B; t, J: S/ V
int day,month,year,sum,leap;
8 h$ Z: d7 Z, u2 n9 vprintf("\nplease input year,month,day\n");
9 H) ?8 v3 V6 k! R- M  mscanf("%d,%d,%d",&year,&month,&day);
9 a; T9 K- a, Jswitch(month)/*先计算某月以前月份的总天数*/
{ case 1:sum=0;break;
8 c5 o* T5 E6 T( W* ~8 ]case 2:sum=31;break; 5 z3 @9 C6 s( N" N
case 3:sum=59;break;   r# E7 x" M5 V4 q# G, p
case 4:sum=90;break;
; ^% F& Q: p& S! U* h# ycase 5:sum=120;break; ' v# D7 v+ v5 F* e; @+ _. O
case 6:sum=151;break; : n" N( X3 v5 t9 O+ i7 n
case 7:sum=181;break;
  d8 f9 j9 O* qcase 8:sum=212;break; - \$ J* \& \& C: k1 E% ]! ?
case 9:sum=243;break;
7 g7 \6 v* s% L& t/ wcase 10:sum=273;break; 6 C9 B) B2 \9 j: [' b  c
case 11:sum=304;break;
3 \) K: q$ [9 f8 L$ J' pcase 12:sum=334;break;
( s% @+ V# c' i9 S+ |default:printf("data error");break; } + v* t# a3 S7 k, _( |+ A
sum=sum+day; /*再加上某天的天数*/
  o1 X+ u9 m! ]0 ]0 Bif(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/ ) }! R. A$ x  `3 @/ y/ [
leap=1; , ~0 p4 r% O5 v3 e) R
else
% _' w( E- v8 r6 Ileap=0; 2 ?+ f4 d8 N, }3 f8 P
if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/ . Z$ }* ^" S8 N
sum++; & a9 S" E5 E& i" T
printf("It is the %dth day.",sum);} ( H9 C/ _' w5 ^& {
============================================================== * K5 {) C* T+ d2 [
【程序5+ h" h: }( P1 T6 K/ W! P6 d" p: m
题目:输入三个整数x,y,z,请把这三个数由小到大输出。 ) O  v# ]7 C/ ~$ @. c$ v
1.程序分析:我们想办法把最小的数放到x上,先将xy进行比较,如果x>y则将xy的值进行交换, 3 w# m9 R6 T4 \2 j# ^0 q$ I& w/ E
然后再用xz进行比较,如果x>z则将xz的值进行交换,这样能使x最小。
0 F# a6 P4 y7 q2.程序源代码:
4 Q" h: s" T; B2 y2 ~main() {
, p9 W) g' S% H0 V6 \/ Cint x,y,z,t; # I4 N- l* ~1 h& L
scanf("%d%d%d",&x,&y,&z); 2 l* s+ E- `, p# a; a
if (x>y) + U. ^5 H( G( g3 [) D
{t=x;x=y;y=t;} /*交换x,y的值*/
2 x& w0 |. L. Rif(x>z) 6 O- E8 e) c4 S
{t=z;z=x;x=t;}/*交换x,z的值*/
2 c( C5 p, o) f5 s0 T6 ^3 jif(y>z)
3 l4 k* e4 C# U' a) b" O* P0 A9 a{t=y;y=z;z=t;}/*交换z,y的值*/
/ M* O4 d1 G/ i+ a' l( iprintf("small to big: %d %d %d\n",x,y,z); }
; t/ L* b- T2 p; u7 C

6 _: M  n/ b- U7 o7 Q) |




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