找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

C语言经典算法100例

[复制链接]

114

主题

136

帖子

1000

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
【程序1
" {7 B0 w( n4 T3 t题目:有1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
  m+ @3 {; x3 {' h6 G6 r1.程序分析:可填在百位、十位、个位的数字都是1234。组成所有的排列后再去
, i3 F+ s. v5 _' _0 x掉不满足条件的排列。
5 d  X5 X* g3 R& E+ M2.程序源代码:
3 l& i. o! S& f* e0 Cmain() { ) }- N3 K3 M0 `5 S
int i,j,k; 9 |) T# f7 ]) i4 T) H9 \
printf("\n");
7 l) O3 r) N, Wfor(i=1;i<5;i++) *以下为三重循环*/
2 N6 A" Y; x$ }2 bfor(j=1;j<5;j++) ( y* g4 ?( O* U, r9 c7 b' L2 G0 o0 w
for (k=1;k<5;k++) { 5 U  `' ]7 J5 [$ [, K5 `
if (i!=k&&i!=j&&j!=k) /*确保ijk三位互不相同*/ 7 d' p& j2 f0 k, Z
printf("%d,%d,%d\n",i,j,k); }} * B+ O( X5 S* {. }$ v) \) l# _
============================================================== / s; n5 w0 V: a% `4 E
【程序2) }4 }* X4 c1 |" Y) m- k. {( k$ m
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
, \3 E% q& U* z5 t8 b9 |$ H6 z5 H9 r" l10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 " [  O" q0 y3 }( q$ d
7.5%20万到40万之间时,高于20万元的部分,可提成5%40万到60万之间时高于
, W6 J/ b) ]" R! n( l40万元的部分,可提成3%60万到100万之间时,高于60万元的部分,可提成1.5%,高于
1 ?& S& A8 ^1 t1 k100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? # G0 h- z- w2 B5 [
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
3 t) K- A7 A$ A/ L# g2.程序源代码:
. p: B# t& k9 nmain() {
4 o: {$ ~' e3 E/ F: u& Glong int i;
' m2 @+ o7 F# X2 O( X: e% [; pint bonus1,bonus2,bonus4,bonus6,bonus10,bonus; / g! c. @0 n; Z0 K
scanf("%ld",&i);
6 E! c* t, P- g6 s# q6 e! c* z, lbonus1=100000*0.1;bonus2=bonus1+100000*0.75;
+ O# S, k2 g, L# ^! y; mbonus4=bonus2+200000*0.5; % a' w; [: A3 D& }8 ]" V
bonus6=bonus4+200000*0.3;
0 i: D4 c5 P6 ]+ _9 `" v! |* ]1 nbonus10=bonus6+400000*0.15;
; v5 K. o9 l2 d$ E; R) v, ]$ y- [. x9 Hif(i<=100000)
5 r4 H% B5 ?- W' _6 O, Nbonus=i*0.1;
3 d; F2 s2 I0 h' uelse if(i<=200000)
! V) T9 [( q. U' C- R* g3 s, J6 wbonus=bonus1+(i-100000)*0.075;
' p4 e  J' o8 K& n+ Q2 belse if(i<=400000) 5 [2 F9 }3 H3 E" q
bonus=bonus2+(i-200000)*0.05; 7 [' p1 K& a' P9 ^3 Y
else if(i<=600000) 6 z8 B# W4 Y9 L5 f# e; b6 f
bonus=bonus4+(i-400000)*0.03; # P; ^9 M; V3 M8 w0 y: N" v
else if(i<=1000000)
# J. Z1 X/ I9 I3 o& ^. [* Kbonus=bonus6+(i-600000)*0.015;
, u0 }" Z+ i/ Q5 Telse 3 ~, N1 ~% h9 t8 ?& d5 j8 E2 R
bonus=bonus10+(i-1000000)*0.01; ' }" x- V; T, J( z, E+ q& [
printf("bonus=%d",bonus); } ! w, T  @3 |4 J# l
============================================================== + E. e- u; h* w  [
【程序3
0 i) ~0 c7 I% @. B2 K题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
/ X# ?: j) M" C. i4 j) C1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后 5 k2 _% p' s: z& z3 m: V# n; Z
的结果满足如下条件,即是结果。请看具体分析:
( ?9 @9 ]& h  }8 n  k. |2.程序源代码:
: {2 ?4 p0 t6 \. `3 _6 R5 S#include "math.h"
+ G& A, {, `& b4 [6 y, w5 ?main() { 5 Z# c6 Y8 w6 \9 y
long int i,x,y,z; 5 L! d( n# _9 z) ]: j, I, n
for (i=1;i<100000;i++) % f! c; p% C1 Y- @7 t- c' A
{ x=sqrt(i+100); /*x为加上100后开方后的结果*/
0 |6 D0 w) c; E& Gy=sqrt(i+268); /*y为再加上168后开方后的结果*/
8 m6 L7 |& @. Q/ M2 [+ Pif(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
6 [# L, `5 a( K) X0 @printf("\n%ld\n",i); } } * e, X+ Q! {- Q! v+ E
============================================================== , X  X6 P+ N: ^4 X, Q
【程序4
2 j) ]2 [! r0 P4 |% y题目:输入某年某月某日,判断这一天是这一年的第几天? + a# H% o- S; I1 R/ @8 @
1.程序分析:以35日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊 - W! i" a) }2 `! o  n( E
情况,闰年且输入月份大于3时需考虑多加一天。 ) T' v/ g6 E1 y2 g
2.程序源代码: , s. b  c: \6 B. w3 }; p
main() { & O+ [' U7 S, S3 w; ?
int day,month,year,sum,leap;
5 g4 e9 c1 n: `3 hprintf("\nplease input year,month,day\n"); , H* |5 g4 t% \4 B' B% R4 j
scanf("%d,%d,%d",&year,&month,&day); ' n- i3 w3 F( w5 d$ \
switch(month)/*先计算某月以前月份的总天数*/
{ case 1:sum=0;break; 4 @6 B9 t8 E6 c4 n( R' ~1 Q
case 2:sum=31;break;
( `# L3 W  D7 T% n' B- A, Ocase 3:sum=59;break; $ p+ N; S" F$ \- q: h8 S1 q
case 4:sum=90;break;
. I# p, D0 h$ ?3 r2 C" y6 L/ \% s( Ycase 5:sum=120;break;
0 F7 p# F! x& gcase 6:sum=151;break;
0 @& e/ B: e4 s# Z5 icase 7:sum=181;break; 9 ]" t% G8 }$ ?. @( P  p. o
case 8:sum=212;break;
8 ~9 r& F, D0 `case 9:sum=243;break; / f% d! W/ ]! A0 b/ w4 M6 \
case 10:sum=273;break;
1 m9 K/ M( A( E% B5 |: xcase 11:sum=304;break; % }( z2 k+ G7 y/ k# g
case 12:sum=334;break; , s; T# Q, O! O6 e
default:printf("data error");break; }
4 M0 |0 a0 i5 isum=sum+day; /*再加上某天的天数*/
2 O' B# Z8 j- x! C  H6 ?if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
1 U3 z) A( }; p% z6 ?' kleap=1;
. b* P" Q9 b( T8 y4 x/ D! U9 felse
3 ~1 X0 A6 g0 I+ o, v, dleap=0; : H/ l* w' B& v9 G% J% U: I
if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/ . P4 f5 S) p" h. g  J4 @! Y
sum++; $ A+ G+ p% _# `1 w* Z+ A
printf("It is the %dth day.",sum);}
: \3 K0 f; E/ A3 a' k$ c==============================================================
* w- j: ?2 l  \" l【程序5
% R8 n8 M$ i) f1 y$ {3 i' h题目:输入三个整数x,y,z,请把这三个数由小到大输出。
$ ~6 r- ^9 o. Q4 v5 i1 l7 b1.程序分析:我们想办法把最小的数放到x上,先将xy进行比较,如果x>y则将xy的值进行交换,
% {7 K: Z; D( J/ J$ Z然后再用xz进行比较,如果x>z则将xz的值进行交换,这样能使x最小。
( C1 g. M6 u/ l" `3 n$ E2.程序源代码: 1 E+ w2 l3 D. K5 c( z9 s- X
main() { . ^8 @; b9 \7 A+ I) k
int x,y,z,t; * x, A+ e/ q2 U
scanf("%d%d%d",&x,&y,&z);
$ f0 R  B. L! U; g1 vif (x>y) 8 M: U: V. G; _, ^
{t=x;x=y;y=t;} /*交换x,y的值*/ ( F- |7 Z& g9 j6 x2 [
if(x>z)
/ c- ^' Y/ G% W. U% m. @; e, V6 {9 C{t=z;z=x;x=t;}/*交换x,z的值*/
. h  S5 u. _  i, w. S8 ?! nif(y>z) / j& j& Y; }) A0 x' j  Y
{t=y;y=z;z=t;}/*交换z,y的值*/ 0 @  m5 @* Z  a, H8 a: o$ M
printf("small to big: %d %d %d\n",x,y,z); } % H4 a& u! X# _* r& y

" W, O8 X/ q4 g! B0 v; o5 f  Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-3 22:18 , Processed in 0.056233 second(s), 33 queries , Gzip On.

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

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

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