红联Linux门户
Linux帮助

关于C程序算法的简化

发布时间:2008-02-05 12:12:19来源:红联作者:lizeliang
近一些天看了一些算法,发现用C写的基于类的几个算法比较不错:
高复杂度的程序千千万万,但低复杂度程序是有限的,且常常是唯一的。变高复杂度算法为低复杂度算法有几个途径:

[size=3]1.变嵌套多重的条件句为一重循环句:[/size]

例:所得税问题
(y为所得税,x为月收入)。

[table=390][tr][td]
[/td][td] 0 ;x<=2000;[/td][/tr][tr][td] [/td][td] (x-2000)*3% ;2000100000;[/td][/tr][/table]

常规思路:
用一个嵌套多重的条件语句:
[/size][size=10.5pt]#include
mian()
{
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);
}

这样即使需要改动数据,也无需改动程序,而且程序的复杂度大大降低了。
文章评论

共有 1 条评论

  1. 暗夜 于 2008-03-09 01:57:03发表:

    学到了..............