关于C程序算法的简化

上一篇 / 下一篇  2008-03-03 10:46:43

LUPA开源社区o7E:e)B n&|

近一些天看了一些算法,发现用C写的基于类的几个算法比较不错:
j8pM!H'?QU0高复杂度的程序千千万万,但低复杂度程序是有限的,且常常是唯一的。变高复杂度算法为低复杂度算法有几个途径:
LUPA开源社区/V!Zv.rvB

1.变嵌套多重的条件句为一重循环句:
LUPA开源社区+kCn5DJ v0l L(a

例:所得税问题
k.SzUgW%jW0(y为所得税,x为月收入)。
LUPA开源社区e f:\*Hc^Ud!sO

LUPA开源社区v*O2Gv xT

q4?)L(z Sgf9{9`0 

+v;Mfc[mk0
 0  ;x<=2000;
   (x-2000)*3%  ;2000<x<=5000;
 y=  (x-5000)*5%+90 ;5000<x<=10000;
   (x-10000)*10%+340  ;10000<x<=100000;
   (x-100000)*30%+9340  ;x>100000;

W*IJYw"s}b4I Jg"f$b0

$e"T1w:N v;^-M6UP0常规思路:
p {Z!JB1H7o0
用一个嵌套多重的条件语句:LUPA开源社区bB1AJ1AiE

xm5Y%u,G"_\ q0#include <stdio.h>LUPA开源社区dR;HoI
int main(/*int argc,char **argv*/)
4P~'B1E:AM2K0{
j c3a a2U:D}1?3w0      flaot x,y;
(g'W/b|9}Ma!X0      scanf("%f",&x);LUPA开源社区.u$k}W$T[5t
      if(x<=2000)LUPA开源社区&A.\&W}g a V
          y=0;LUPA开源社区 h'Gp_;O`qs
      elseLUPA开源社区 u z](o"H Y&Za
          if(x<=5000)
{m#~-S O)CQ0               y=(x-2000)*0.03;
E`I^I(DV R0
      elseLUPA开源社区];yklTn
          if(x<=10000)LUPA开源社区|!A6{;U(N&Zu
               y=(x-5000)*0.05+90;
t%x_+NWw)bY0      elseLUPA开源社区 V#I6S L1gv1w
          if(x<=100000)
]9F n}[n0                y=(x-10000)*01+340;
7Id-CO;OGK8] t!G0      else
l-`]._T v0           y=(x-100000)*0.3+9340;
;w pyqX9kfy|0      printf("%f",y);LUPA开源社区I5B&m1Z7Z+~3},Xbd x8v:u
}
~]N*ic/ud0这种程序比较好想,但不通用(所谓通用,就是指情况发生变化后只改变数据不改程序的程序)。
tC n |`8@q0下面是一种比较通用的算法,大家可以比较一下:
LUPA开源社区plx*bP.V

LUPA开源社区S;F8s)J-P x

#include "stdio.h"LUPA开源社区 Qw7X7G9|&R6U
#define N 4LUPA开源社区(} XvA+v D
void main(/*int argc,char **argv*/)
,]&dbW;p0{
R E:an%sr!lm0    float a[N+1]={0,2000,5000,10000,100000},LUPA开源社区O2o JDsLj$Ke$D
     b[N+1]={0.0,0.01,0.05,0.1,0.3},
,{&z(PUvE0tg"Y0     c[N]={0,90,340,9340};
U&?j.v0w^A@0    float x,y;LUPA开源社区i;@i6s(A\
    int i;LUPA开源社区iw_"TaH
    printf("Please input your Wages:");

}'\&MW!HD-]0    scanf("%f",&x);
mC*x ?1|t:O.MB0LUPA开源社区8`9^*Y5A'M d N
/* 该段为我加上的,防输入格式出错LUPA开源社区 DOWm(@
    while(1)
H$i\vN0    {LUPA开源社区;SD#meA;y
     if(x>=0)
{|*Q1S\Rm0      break;LUPA开源社区CY;ceaH1]:y.G,cA
     elseLUPA开源社区p3h;CC%Y7\]
     {
z!R0F3] V:w0          printf("ERROR!\nPlease input your Wages again:");LUPA开源社区6o E\Kn$@
          scanf("%f",&x);LUPA开源社区 cu4c|.J tm-P
      }LUPA开源社区Dz6a7Ff r
    }
'zM ^3V%[Y0*/
N/g6?wY}]0    i=N;LUPA开源社区0c2B.z3rA8Q;_:G,w
    while(x<=a[i])LUPA开源社区m"p(U/sG V4F@
     i=i-1;
{,w2mF[J/TZ V+v0    printf("%f %d",y,i);
^f |+D A%I.Fi5p0    y=(x-a[i])*b[i]+c[i-1];LUPA开源社区of { ^F
    
&e2_cU@/w$F dK0/*我更喜欢用for循环
t]e.gy(_q5]s0     for(i=N;x<a[i];i--);
s3_9ZU Z:k5[1c0     y=(x-a[i])*b[i]+c[i-1];
#F(K$Dg+Uq0*/

M [1r4q)lu;a'|0    printf("应交税为:%f",y);
6`:P+gkDY;ofRn:c0}
LUPA开源社区~X zk/R3Kb

@b2XUAc e0这样即使需要改动数据,也无需改动程序,而且程序的复杂度大大降低了。LUPA开源社区 dG bV,?:cD:e


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 958
  • 日志数: 17
  • 图片数: 2
  • 文件数: 1
  • 书签数: 6
  • 建立时间: 2008-03-01
  • 更新时间: 2008-08-18

RSS订阅

Open Toolbar