找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 81|回复: 0
打印 上一主题 下一主题

C语言经典算法100例

[复制链接]

114

主题

136

帖子

1000

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
【程序1
! V+ ~  E) k; c. y4 A  m题目:有1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
! D1 q. S1 v; E2 O3 P% T1.程序分析:可填在百位、十位、个位的数字都是1234。组成所有的排列后再去 # {+ V" m0 v& P4 a7 e5 U  c
掉不满足条件的排列。
$ }6 O7 A$ m" C8 b8 h: C( C9 R% b! K2.程序源代码:
1 m$ P2 f0 R& c' \& }4 |& Umain() {
- o" e0 ^/ u/ f8 `- i* Pint i,j,k; / ]8 N  l1 a9 p, a4 F
printf("\n"); 0 z  ]. D: L, o- {
for(i=1;i<5;i++) *以下为三重循环*/
- R* t1 S0 Y" f/ Z+ _6 A) wfor(j=1;j<5;j++)
; ]7 Y6 r) i; M) e# bfor (k=1;k<5;k++) { . h' }& ?- l, G( x
if (i!=k&&i!=j&&j!=k) /*确保ijk三位互不相同*/ 3 s7 a* f6 D$ C+ o+ u' M) k
printf("%d,%d,%d\n",i,j,k); }} 0 p" Q- N6 U& F$ Y, [9 H9 U1 M
==============================================================
6 A) {/ M2 s$ J+ C# T" q0 B【程序2
" v& U. y, R* `0 K+ ?. X题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
5 a- i# Q2 Q3 j- w5 C10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
% ]4 a* r) G- \6 _  S7.5%20万到40万之间时,高于20万元的部分,可提成5%40万到60万之间时高于 3 i  f' h& N0 V
40万元的部分,可提成3%60万到100万之间时,高于60万元的部分,可提成1.5%,高于 ; v0 ]2 ^  k' R# {1 g5 B
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
8 H% ^/ V$ y; `# i- {) @1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
( k. u! s) p! T  a" E+ E/ g4 c2.程序源代码: - Y. `! \5 m& V4 g2 P$ a
main() {
8 H8 K7 d# J7 p# a% c" a, Ilong int i; * A+ N: y9 f- B4 e9 d
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
' d4 A+ Q8 K, q+ p9 m  Hscanf("%ld",&i); ! ?" u  b. v  g/ C# ~: U. V+ Z; U
bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
2 M3 x/ [8 O% f: u+ g- _& |bonus4=bonus2+200000*0.5; ) \! \7 u( H4 s9 O' |) P/ d; v
bonus6=bonus4+200000*0.3;
7 b. Z2 w  k( ^1 gbonus10=bonus6+400000*0.15; $ ^( i6 M0 Z# l. v: w% i( y
if(i<=100000)
; j% q/ q( c: Mbonus=i*0.1; 5 g# t1 G& p4 U# C( [
else if(i<=200000) 4 O  M$ G: F# q
bonus=bonus1+(i-100000)*0.075; 9 K, I9 k# [1 v  ^2 s
else if(i<=400000) 5 j2 Y: f& d# E  _; }
bonus=bonus2+(i-200000)*0.05; 4 P+ V% k, u" `: O9 H$ N
else if(i<=600000)
" g9 `2 {# m* e/ D$ `  }bonus=bonus4+(i-400000)*0.03;
  ~7 \, ~/ Y; {) K: ]# u: Welse if(i<=1000000) ; {& {) _( |- P2 Y3 _. p
bonus=bonus6+(i-600000)*0.015; * _' g, \9 F4 ?$ O6 O
else
# f: k5 D+ p- r0 ?3 G5 R  `" gbonus=bonus10+(i-1000000)*0.01;
( N! c$ a. j' G$ J0 lprintf("bonus=%d",bonus); } 6 z) h+ ~. h9 U! ?: C, F% ^
==============================================================
# N9 u# `! K5 |【程序3
; }" R9 O7 a2 ?, e, e题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 4 z+ v5 M4 j7 B9 c9 G! m  D
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
& Q: v, j' l8 `% b的结果满足如下条件,即是结果。请看具体分析: 8 _0 V; z; p, ~
2.程序源代码: . O1 q# Z3 T! X
#include "math.h" . ^9 T5 F' ]3 L1 n' E( a! D
main() { ( K& O2 l: w! z! s: C4 K- V1 ?5 q
long int i,x,y,z;
8 ^" l% k5 u9 N. G  I7 a1 jfor (i=1;i<100000;i++)
( X5 Y$ }# j+ g+ |8 J' ^+ C{ x=sqrt(i+100); /*x为加上100后开方后的结果*/
1 f4 N$ G$ h' ?; L5 Oy=sqrt(i+268); /*y为再加上168后开方后的结果*/ & T& @2 E; f6 B& F' b. q/ H
if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
! u& [: x8 N  m8 I9 [( r, v9 qprintf("\n%ld\n",i); } } / e7 _( B$ V3 N* c
============================================================== 4 E# M7 v5 b1 q2 ?1 c
【程序4
) G) |8 ?7 q0 }7 Q7 I) z: G题目:输入某年某月某日,判断这一天是这一年的第几天? 3 ^6 G0 [" H5 u7 y6 a# D% T& R
1.程序分析:以35日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊
5 t! `6 z4 z/ P( e+ X$ o. t$ v* O情况,闰年且输入月份大于3时需考虑多加一天。
  c. H; T4 h& O+ ~& N, l+ n2.程序源代码: / g1 p$ t5 D$ F: K; l
main() {
7 R/ k) M: T7 u' gint day,month,year,sum,leap;
$ I: A4 a# n4 ^$ [3 jprintf("\nplease input year,month,day\n"); # C. u! \9 d9 e' i! C2 o% ~- E5 [$ C
scanf("%d,%d,%d",&year,&month,&day); ; W, o9 x7 \" t# n1 C4 M2 i! r
switch(month)/*先计算某月以前月份的总天数*/
{ case 1:sum=0;break;
( p8 G2 H" j0 o8 hcase 2:sum=31;break;
  S8 ~5 Y5 k+ U$ K7 u" `' F2 \case 3:sum=59;break;
. S1 {3 M2 w) Rcase 4:sum=90;break;
+ y2 Q9 ]; [$ n+ S. I  [2 X$ J- ecase 5:sum=120;break; 9 ?2 }2 _) S) T% _2 |
case 6:sum=151;break; % X) m5 O! @- I4 u& u# \
case 7:sum=181;break; * q7 _8 n5 R9 T+ Q
case 8:sum=212;break;
5 v7 m( @( G) w) zcase 9:sum=243;break; $ b( M% |7 }# D; V& s: z! x
case 10:sum=273;break;
5 |; w2 J3 ?, L/ k5 h; u# ~; t  Gcase 11:sum=304;break; 5 I( m- z! q# o. x
case 12:sum=334;break; 3 J6 _" I; D; a
default:printf("data error");break; } ) Q  m+ w* d; X( w7 h5 w
sum=sum+day; /*再加上某天的天数*/
) \5 s3 B0 g0 f9 P7 M) hif(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
1 j0 v/ ~7 ^+ K* I- ?2 dleap=1;
: ]1 ?" r2 O  Q, a% Y% {else
  c! Q) r( `- g4 {' q! G3 n2 h* w. dleap=0;
6 a# s0 [: v& N/ J. v' d; iif(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/
7 J7 R% o) s% s, \) }sum++;
# t. D) E; C! W$ A4 k# ^# z- L4 Mprintf("It is the %dth day.",sum);} 0 ]" `0 y# d  W  y
============================================================== 3 S# y. {3 R3 o$ a, z& f7 X
【程序52 G1 |! P. t) k' m
题目:输入三个整数x,y,z,请把这三个数由小到大输出。 ( h/ y3 Y; L( a5 k
1.程序分析:我们想办法把最小的数放到x上,先将xy进行比较,如果x>y则将xy的值进行交换,
. F6 e# |: n: b5 l3 p然后再用xz进行比较,如果x>z则将xz的值进行交换,这样能使x最小。
$ v$ l1 t) V" O+ i; ~, u. Q; @2.程序源代码: . K4 D# [6 [( T' y9 e; {- {
main() { " j) g5 x! I1 W5 r
int x,y,z,t;
$ }* F3 o+ T/ \: mscanf("%d%d%d",&x,&y,&z); 0 u3 y7 W1 b# Q; r7 K8 O
if (x>y)
$ ]% x. H1 c4 F- W1 Z( F{t=x;x=y;y=t;} /*交换x,y的值*/ 9 w2 W9 ]7 t6 J: z9 [
if(x>z) . P9 v, f9 ^9 Y4 a+ R% X; \' B% g3 m
{t=z;z=x;x=t;}/*交换x,z的值*/ ! y! ~" D% G* }0 K, K
if(y>z)
7 E$ R6 x8 x! ?- y* F7 q. D/ w$ }2 B0 y{t=y;y=z;z=t;}/*交换z,y的值*/
' ?+ K2 n4 _/ N1 {) bprintf("small to big: %d %d %d\n",x,y,z); } # E4 t* A  K+ K, @7 f0 h' Z

  v: v& R7 s# Y2 T7 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-9-20 00:09 , Processed in 0.075892 second(s), 33 queries , Gzip On.

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

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

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