高复杂度的程序千千万万,但低复杂度程序是有限的,且常常是唯一的。变高复杂度算法为低复杂度算法有几个途径:
[size=3]1.变嵌套多重的条件句为一重循环句:[/size]
例:所得税问题
(y为所得税,x为月收入)。
[table=390][tr][td]
[/td][td] 0 ;x<=2000;[/td][/tr][tr][td] [/td][td] (x-2000)*3% ;2000
常规思路:
用一个嵌套多重的条件语句:
[/size][size=10.5pt]#include
{
flaot x,y;
scanf("%f",&x);
if(x<=2000)
y=0;
else
if(x<=5000)
y=(x-2000)*0.03;
else
if(x<=10000)
y=(x-5000)*0.05+90;
else
if(x<=100000)
y=(x-10000)*01+340;
else
y=(x-100000)*0.3+9340;
printf("%f",y);
}
这种程序比较好想,但不通用(所谓通用,就是指情况发生变化后只改变数据不改程序的程序)。
下面是一种比较通用的算法,大家可以比较一下:
#include "stdio.h"
#define N 4
void main()
{
float a[N+1]={0,2000,5000,10000,100000},
b[N+1]={0.0,0.01,0.05,0.1,0.3},
c[N]={0,90,340,9340};
float x,y;
int i;
printf("Please input your Wages:");
scanf("%f",&x);
/* 该段为我加上的,防输入格式出错
while(1)
{
if(x>=0)
break;
else
{
printf("ERROR!\nPlease input your Wages again:");
scanf("%f",&x);
}
}
*/
i=N;
while(x<=a[i])
i=i-1;
printf("%f %d",y,i);
y=(x-a[i])*b[i]+c[i-1];
/*我更喜欢用for循环
for(i=N;x y=(x-a[i])*b[i]+c[i-1];
*/
printf("应交税为:%f",y);
}
这样即使需要改动数据,也无需改动程序,而且程序的复杂度大大降低了。


暗夜 于 2008-03-09 01:57:03发表:
学到了..............