找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

C语言经典算法100例

[复制链接]

114

主题

136

帖子

1000

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
【程序1. U+ \- ~1 r. F0 w
题目:有1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
: e* V- D) s6 x* o% t/ g1.程序分析:可填在百位、十位、个位的数字都是1234。组成所有的排列后再去 5 {. ~( z3 {" S8 ^+ B; N8 h, h
掉不满足条件的排列。 5 I7 {. S( @1 S' f: I8 p
2.程序源代码: 6 i8 ~+ T$ |* C' k& S; x! I
main() {
& Z) q: G+ Y2 F) ]2 }2 \" j  {int i,j,k;
; O' j3 c2 ^, C& l( e* |( x: nprintf("\n");
1 A* P' B' s8 \for(i=1;i<5;i++) *以下为三重循环*/
1 l4 R0 W( I. W+ T7 lfor(j=1;j<5;j++) " b) k' ?9 [$ C& B( p8 \
for (k=1;k<5;k++) {
  F; }4 z/ Z# v2 Q1 V, }if (i!=k&&i!=j&&j!=k) /*确保ijk三位互不相同*/ 7 Z$ }& H; {% Q4 H
printf("%d,%d,%d\n",i,j,k); }}
' \! _" i" v- R0 @! P# o. A$ S5 T==============================================================
) @5 X; Y8 T' k" o- o: W# X【程序2
: T: J- E0 o: I! x) F' t题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 ) d8 u. j: E1 @8 C8 D
10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
% ^6 X7 c) z5 m6 p' G3 r7.5%20万到40万之间时,高于20万元的部分,可提成5%40万到60万之间时高于 1 ^/ {, |7 H$ {6 D# [2 s
40万元的部分,可提成3%60万到100万之间时,高于60万元的部分,可提成1.5%,高于
. H* C# F( E. X' f! a100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
& r+ s! D3 G) S; F5 O1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
  }* t: u! |+ n' y% q9 Q0 a2.程序源代码: * c3 P1 ^5 f3 K. h" e9 W
main() {
$ r  M) T" N. A9 w% z: p. elong int i;
3 M$ ~4 r- y+ dint bonus1,bonus2,bonus4,bonus6,bonus10,bonus; 6 t6 l9 I7 S7 a
scanf("%ld",&i);
5 K6 O  d: E3 \bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
# ^% u4 m2 U$ _+ B, ybonus4=bonus2+200000*0.5; 3 [" Q, P) P! Y3 I8 Y% S
bonus6=bonus4+200000*0.3; # E; _" ^, @# l- e7 N/ Y: _% U
bonus10=bonus6+400000*0.15; : B4 Q+ T4 T: y5 X
if(i<=100000) 6 R! C$ i4 ~: w
bonus=i*0.1;
6 I& c. b3 l9 ^: R9 @$ O6 Uelse if(i<=200000)
$ u) W8 V# [# W6 W% y( S  _bonus=bonus1+(i-100000)*0.075;
3 q: o* N& U& z' b! [( qelse if(i<=400000)
# ~) k3 N* t) T3 u1 q) kbonus=bonus2+(i-200000)*0.05; " Y. G. g; F# a8 C- F2 T6 A; c
else if(i<=600000)
2 B5 f' y+ y" {1 Z, e2 qbonus=bonus4+(i-400000)*0.03;
& h# U, o$ f, n0 _2 Z  p# Oelse if(i<=1000000) ' I6 P5 v% F- B3 m; F7 K" ^" C8 V0 ^) ^: U
bonus=bonus6+(i-600000)*0.015;
* o4 @& G# L; `4 ^else
, ?& e+ W& I# x6 r/ o$ H3 \5 Nbonus=bonus10+(i-1000000)*0.01;
/ A* @# J/ ]: F/ d* L& z9 `+ Xprintf("bonus=%d",bonus); }
* D- B7 i; h& y  _; `  g============================================================== $ `) N+ f' L/ I+ e
【程序3
% H# v2 `- T2 ?" L) t题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 9 o  H. y, _- S3 R" e, D+ x
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后 1 d( V. P6 e2 L2 x: k1 X, B
的结果满足如下条件,即是结果。请看具体分析:
5 n, p3 a5 u. m, _$ d4 F) Y& M$ u3 h2.程序源代码:
/ q# D/ _1 ^7 Q* j# N4 q#include "math.h"
* {7 C& P' R$ x: q/ ?' M4 Ymain() {
" l. W- q) h4 R6 t6 ulong int i,x,y,z; 2 y9 @! O& G' C
for (i=1;i<100000;i++)
6 b# |, k3 g2 Y  C8 i3 F{ x=sqrt(i+100); /*x为加上100后开方后的结果*/ 8 {3 D3 b, Q3 e( G
y=sqrt(i+268); /*y为再加上168后开方后的结果*/
* u6 ~& i* j& h0 ^9 Mif(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/ ' u* \8 j- Z6 h" `; a
printf("\n%ld\n",i); } } " A) X4 `$ w: G
==============================================================
5 ~5 e0 w, w/ V/ j9 }【程序4
, T  M# s+ ?$ J! N. D题目:输入某年某月某日,判断这一天是这一年的第几天? : e" v4 z" i* ~# p
1.程序分析:以35日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊 $ S4 u* D1 z9 `" t& c2 |
情况,闰年且输入月份大于3时需考虑多加一天。 ' {! Q2 u. f' g! n
2.程序源代码:
2 J: m. K' r) j) s* t+ a7 z  V6 q, Imain() { 5 F& d/ J+ T3 w: P" r9 j
int day,month,year,sum,leap;
% B( E8 B6 J* Q) @/ aprintf("\nplease input year,month,day\n");
+ F7 j( m: z" x* ?/ hscanf("%d,%d,%d",&year,&month,&day);
8 v3 A& w- D- F$ q# M, h9 c0 wswitch(month)/*先计算某月以前月份的总天数*/
{ case 1:sum=0;break; 4 n6 V) g9 s% v5 b1 I. m( c
case 2:sum=31;break;
' ^: A, U5 e2 t: O# M" O- ecase 3:sum=59;break; % ?( Q- H: Y& R5 C+ C; z' A% m' Y  }* C
case 4:sum=90;break; 6 _# _' K" {6 K: b9 @
case 5:sum=120;break;
! S7 {/ o' x0 D4 U* f8 f$ ]7 Gcase 6:sum=151;break;
# O% A2 k$ H. M8 Ucase 7:sum=181;break;
. {  E% Z$ Z1 ?. c  t  \& A1 Ecase 8:sum=212;break; 2 o$ {/ W, t4 n0 s; g4 {4 C
case 9:sum=243;break;
4 L6 o: X0 v1 ]4 `0 t' \+ acase 10:sum=273;break;
: S( ?; \. A* z* o& t6 ?1 b' jcase 11:sum=304;break; 4 g0 Z, {- J1 x3 B# G
case 12:sum=334;break;
% E" |1 }7 x* u' x$ }7 Zdefault:printf("data error");break; }
2 j4 z) u* @7 ~' \+ u, a2 I' Rsum=sum+day; /*再加上某天的天数*/
5 o; m$ I) r9 E5 |1 D8 E! kif(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
) b6 e2 a$ T) A+ g9 ^leap=1;
" g5 f/ H- a! [  U! l; Felse ' ~8 v& q1 R8 _1 o$ A9 A- j* P% B
leap=0;
- {: Q: p  v" O- Q# F8 Uif(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/ 4 X" _7 A, U+ I
sum++;
2 ]+ R# \. D5 A* c& Cprintf("It is the %dth day.",sum);} $ C- `) j% G! ?; E6 [
============================================================== , }; p' @8 a4 r" r
【程序5: n* v) k8 O; N  P4 k
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
* a: \; ^8 x0 w/ O5 G5 y0 `7 N1.程序分析:我们想办法把最小的数放到x上,先将xy进行比较,如果x>y则将xy的值进行交换, ) C& t$ c, E2 o- G7 Z, Y, u! [2 C6 B
然后再用xz进行比较,如果x>z则将xz的值进行交换,这样能使x最小。 9 V' v' ^2 \, N' a0 k
2.程序源代码:
7 v" `2 i6 R4 T7 k" A. R% lmain() { 7 y0 H. a' @" @# E$ i
int x,y,z,t; ; |" F! e& z/ c' |. P3 ]# u& Y* J$ K
scanf("%d%d%d",&x,&y,&z);
& J4 i  ?1 K" k: C; y7 D$ J* [; r9 Jif (x>y) 3 u5 F0 E, ~% g% l9 m, T( S; @
{t=x;x=y;y=t;} /*交换x,y的值*/ & r& T' a8 y: X
if(x>z)
" n, G9 M" M" Y/ s{t=z;z=x;x=t;}/*交换x,z的值*/ 4 M4 Q  w4 Q3 n! v
if(y>z) 0 L  p1 O& w$ K  `
{t=y;y=z;z=t;}/*交换z,y的值*/ / v3 ^0 O' ?7 Y6 w/ l4 ]
printf("small to big: %d %d %d\n",x,y,z); }
+ O+ h: R& p% S1 X$ l9 g

7 s' A. _( S) x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-19 09:49 , Processed in 0.056509 second(s), 33 queries , Gzip On.

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

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

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