找回密码
 注册
关于网站域名变更的通知
查看: 421|回复: 0
打印 上一主题 下一主题

C语言经典算法100例

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-9-23 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
【程序14 e6 ^% o7 k3 T
题目:有1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
4 E8 ~! k9 b+ G: C1.程序分析:可填在百位、十位、个位的数字都是1234。组成所有的排列后再去
6 k9 X5 P2 T% O& \2 v: ~掉不满足条件的排列。 / F; C: {" t9 D( I
2.程序源代码:
: c6 e# y2 V% {0 u& p8 g: `main() {
/ O, y9 Z2 K) ^) [( Z" |4 |int i,j,k;
2 ], M+ O8 J5 L) E* Rprintf("\n"); ( q! J7 H- W! f" H0 g+ ]
for(i=1;i<5;i++) *以下为三重循环*/ * R% _5 b2 v7 t, v6 ]
for(j=1;j<5;j++) ' ]; z8 t+ c" v' U( u
for (k=1;k<5;k++) { 1 Z4 o: P" _- [& o
if (i!=k&&i!=j&&j!=k) /*确保ijk三位互不相同*/
" t5 n( L. r6 J/ H; Zprintf("%d,%d,%d\n",i,j,k); }}   |  t# @5 S$ `/ y4 Y# j
==============================================================
& v) z$ q  j/ \+ j【程序2) w- T3 {  P. {, A- q, {( s
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
9 g* y/ j( ^  I10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
& f/ j4 j/ \8 o+ g7.5%20万到40万之间时,高于20万元的部分,可提成5%40万到60万之间时高于 / w; d4 \) m6 m0 e2 X7 K6 R
40万元的部分,可提成3%60万到100万之间时,高于60万元的部分,可提成1.5%,高于
, l% {& n( d/ W3 Y6 y- t100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
9 q! I/ {& Y  @$ _) H5 X1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
. L; u  E/ ?$ t* @2.程序源代码: ( {" [4 U0 z- Y* y) a
main() {
( u: K/ L6 _  G* b, G' H& nlong int i;
: Q& h$ i0 [/ `( `6 W3 k; p; ~int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
9 c8 y9 S, P! }1 i" o8 L' T8 U" n, zscanf("%ld",&i);
' {3 p! M! K; k/ H$ {$ x" z7 w" v/ nbonus1=100000*0.1;bonus2=bonus1+100000*0.75; 7 Z/ K/ ]* G% C7 Z. V6 S* v# _2 W' g
bonus4=bonus2+200000*0.5;
, p. _* m5 V' \& ^; ebonus6=bonus4+200000*0.3; / Q3 e# Y6 C; y3 D5 E8 @
bonus10=bonus6+400000*0.15;
' i: |( U. X; J- W7 U; S1 _if(i<=100000) 6 |# k- T$ l6 W  K9 m& q
bonus=i*0.1; * r) L) f- b- }) q- V' X4 b# b$ p* J# Q
else if(i<=200000)
3 }1 J" i: y# B! zbonus=bonus1+(i-100000)*0.075;
) ^$ G) H5 _1 H2 Q, @else if(i<=400000)
, C9 I3 R, x, f. j$ U0 k( Q3 j3 Sbonus=bonus2+(i-200000)*0.05; " w& G- B6 k# c: |( L" h
else if(i<=600000) 7 d! M! L# `- B! M+ g# j0 ~! k1 m
bonus=bonus4+(i-400000)*0.03;   b$ f6 n2 H( @% P' v& s
else if(i<=1000000)
1 H9 ?( k- D$ b" N7 S! F# fbonus=bonus6+(i-600000)*0.015; : [) K& y; @, W3 \1 S  L' e5 x
else / \1 m7 p  W4 M5 @) I) n  W
bonus=bonus10+(i-1000000)*0.01;
& O0 R) j. k: z1 S% E, L2 `! A- |printf("bonus=%d",bonus); } ; T8 W1 Z! l$ A5 m8 H0 K
==============================================================
- ~( P$ K0 ]  R* m6 P* c8 O【程序3
  I9 R+ U$ A. J, h$ Q) z( p* X' c题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? ' }% k1 x3 |0 w! w" c6 I
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后 / M# r, J# u. X9 I
的结果满足如下条件,即是结果。请看具体分析:
  T1 y: T/ `! }/ s2.程序源代码: 7 Y" B. J, n' Y
#include "math.h" 8 P7 p1 y: [0 f. Q$ m. V# |+ c
main() {   T1 u$ i7 |1 Z( H* |; _$ u
long int i,x,y,z;
; C9 D; [' ^  L* ]for (i=1;i<100000;i++) + J* Z0 ]* b6 i% k
{ x=sqrt(i+100); /*x为加上100后开方后的结果*/
* j3 h! e) |& c% \+ k* zy=sqrt(i+268); /*y为再加上168后开方后的结果*/
( `$ s9 g3 ?9 [* f4 G4 h/ T- @if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/ $ q1 @$ ]* C9 o$ S4 D8 A# ~
printf("\n%ld\n",i); } } ( n8 F6 q* |9 q
============================================================== , F, w& f' L2 Y: p$ R" B8 {
【程序45 F. e" v5 M; [- Q9 U1 }- [3 h  E1 [/ h
题目:输入某年某月某日,判断这一天是这一年的第几天? 4 i: g1 w, k# E- E
1.程序分析:以35日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊
4 s, Q( Q2 ?! J情况,闰年且输入月份大于3时需考虑多加一天。
: E3 ?  v2 J' o, X+ k- I, J- n2.程序源代码:
2 q  \4 [: N+ N! X% F  i$ C0 H, `main() { 4 G+ _! L9 l8 h0 e2 ]/ R0 A
int day,month,year,sum,leap; / z8 U8 K; E6 }8 \3 a6 o
printf("\nplease input year,month,day\n"); ! L* T; ~7 ?- x
scanf("%d,%d,%d",&year,&month,&day);
9 s0 E* n8 G1 V% _' Fswitch(month)/*先计算某月以前月份的总天数*/
{ case 1:sum=0;break; . T& N  g# j4 {* t9 J, ?! k
case 2:sum=31;break;
& J' Z: w& r2 v" `1 w' @9 Z* Zcase 3:sum=59;break; 4 D; r4 v) }' ?+ @$ D
case 4:sum=90;break;
  m: c6 u4 ]- q& A" c: }$ l/ vcase 5:sum=120;break;
8 O) B9 R8 m0 H6 u* C; z& n! |case 6:sum=151;break;
; Q; t7 {6 c4 z- fcase 7:sum=181;break;
' k9 N; C0 @0 V) A% hcase 8:sum=212;break;
& N% z+ J! A$ Z7 E1 ]4 r- i, Bcase 9:sum=243;break; $ \$ a4 m. U4 f! {1 B+ S5 y8 J( k
case 10:sum=273;break;
; w6 L% M- [+ J3 Xcase 11:sum=304;break;
& Y* s5 w5 R7 b; O& {, Wcase 12:sum=334;break;   D% \4 O: B! B; {
default:printf("data error");break; } - b, |% L# v/ p. x9 l/ ^
sum=sum+day; /*再加上某天的天数*/ 0 E9 k- _+ l4 E: i; n! V
if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
1 r) g0 ]! W3 kleap=1; , ~% ^  J: ]/ |# t* \7 H4 M! \6 s) f
else 4 n" M. `& i' t! N1 N8 K* h
leap=0;
+ H* E, u) L! s- Vif(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/ ( Z+ a0 u4 Y! m2 y2 n
sum++;
8 k4 ]& r2 _, Kprintf("It is the %dth day.",sum);}
6 s: X) i2 }# Z============================================================== . t  ]% k7 J0 [5 m8 m: z
【程序55 X4 L  r% @0 l9 n' ?2 A
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
1 a! u4 @! l% ]/ b2 p( Y; m" H1.程序分析:我们想办法把最小的数放到x上,先将xy进行比较,如果x>y则将xy的值进行交换,
' c' g! j! v: F) J4 M* u# \% A" O然后再用xz进行比较,如果x>z则将xz的值进行交换,这样能使x最小。
: i- ?; ?& P, s% t8 s) d, Q+ I2.程序源代码: 9 p4 m) |" i4 p! L6 B0 x
main() { 7 ?% k/ {8 U- f' }& y" l8 m% `
int x,y,z,t;
4 w/ R) t) }5 J$ z, bscanf("%d%d%d",&x,&y,&z); & A6 K2 D( I2 i5 _
if (x>y) * G( w1 W! B: ~
{t=x;x=y;y=t;} /*交换x,y的值*/
! \) i) L$ Z7 Q  |if(x>z)   l7 l, t, u6 ]$ v9 n  p8 W8 e/ U$ p4 `
{t=z;z=x;x=t;}/*交换x,z的值*/
& _. @' m5 C( H6 {3 i. M' p- e9 ^, nif(y>z) " g/ i* e$ O/ }% M
{t=y;y=z;z=t;}/*交换z,y的值*/ ! u! s. h" }/ x: e
printf("small to big: %d %d %d\n",x,y,z); }
! G& x# k4 t) ~+ H4 I* t
- `2 {" s/ |; q$ i0 `* }; z/ z2 }, p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 12:24 , Processed in 0.156250 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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