[问题]问个c程序100例里面一个程序的问题

C、C++和Java语言
回复
头像
kinzess
帖子: 319
注册时间: 2007-04-11 10:39
送出感谢: 0
接收感谢: 0

[问题]问个c程序100例里面一个程序的问题

#1

帖子 kinzess » 2007-06-07 18:35

尝试过google了
可惜貌似关键字不对。。找不到

这是源码
【程序2】
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
   于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
   成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
   40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
   100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。      
2.程序源代码:
#include "stdio.h"
#include "conio.h"
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);
bonus1=100000*0. 1;
bonus2=bonus1+100000*0.75;
bonus4=bonus2+200000*0.5;
bonus6=bonus4+200000*0.3;
bonus10=bonus6+400000*0.15;
if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
printf("bonus=%d",bonus);
getch();
}

编译正常
然后输入i=100000时 bonus = 10000
可是输入i=200000时 bonus = 17499 (正确答案应该是17500把?)
那么少了个1是为什么呢?
貌似是因为乘的小数是小数点后3位才会出现这样的问题
i = 1000000时 bonus=39499
求解~谢谢
头像
kinzess
帖子: 319
注册时间: 2007-04-11 10:39
送出感谢: 0
接收感谢: 0

#2

帖子 kinzess » 2007-06-12 12:01

郁闷
70多个人看过了
可是还是没人回答
难道是我写得不够详细。。
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

#3

帖子 bones7456 » 2007-06-12 12:42

运算过程中需要用浮点型的数据,float或者double应该都可以满足你的要求。
关注我的blog: ε==3
头像
aqua203
帖子: 283
注册时间: 2007-03-01 21:04
来自: 福建
送出感谢: 0
接收感谢: 0

#4

帖子 aqua203 » 2007-06-12 14:02

3楼正解

bonus2=bonus1+100000*0.75;
类似的句子有问题,bounus1是int类型,100000是long类型,0.75是float类型,最后的计算结果是float,而bonus2又被定义为int,当float被fix为int时就会产生计算误差。

修改这句为:
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
改为float和,或者将百分数改为整除运算,代码如下:
---------------------------
#include "stdio.h"
//#include "conio.h"
int main()
{
long int i;
long bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);

bonus1=100000/100*10;
bonus2=bonus1+100000/100*75;
bonus4=bonus2+200000/100*50;
bonus6=bonus4+200000/100*30;
bonus10=bonus6+400000/100*15;

if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)/1000*75;
else if(i<=400000)
bonus=bonus2+(i-200000)/100*5;
else if(i<=600000)
bonus=bonus4+(i-400000)/100*3;
else if(i<=1000000)
bonus=bonus6+(i-600000)/1000*15;
else
bonus=bonus10+(i-1000000)/100*1;
printf("bonus=%ld\n",bonus);
return 0;
//getch();
}
----------------------------
以上程序在输入3258623等数字时还会有问题,所以最好还是使用float来计算.
头像
kinzess
帖子: 319
注册时间: 2007-04-11 10:39
送出感谢: 0
接收感谢: 0

#5

帖子 kinzess » 2007-06-12 15:05

感谢ls的2位~~
呵呵
万分感谢
:D :D :D :D :D
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

#6

帖子 bones7456 » 2007-06-13 13:02

aqua203 写了:3楼正解

bonus2=bonus1+100000*0.75;
类似的句子有问题,bounus1是int类型,100000是long类型,0.75是float类型,最后的计算结果是float,而bonus2又被定义为int,当float被fix为int时就会产生计算误差。

修改这句为:
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
改为float和,或者将百分数改为整除运算,代码如下:
---------------------------
#include "stdio.h"
//#include "conio.h"
int main()
{
long int i;
long bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);

bonus1=100000/100*10;
bonus2=bonus1+100000/100*75;
bonus4=bonus2+200000/100*50;
bonus6=bonus4+200000/100*30;
bonus10=bonus6+400000/100*15;

if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)/1000*75;
else if(i<=400000)
bonus=bonus2+(i-200000)/100*5;
else if(i<=600000)
bonus=bonus4+(i-400000)/100*3;
else if(i<=1000000)
bonus=bonus6+(i-600000)/1000*15;
else
bonus=bonus10+(i-1000000)/100*1;
printf("bonus=%ld\n",bonus);
return 0;
//getch();
}
----------------------------
以上程序在输入3258623等数字时还会有问题,所以最好还是使用float来计算.
恩,把0.75换成75/100更好!避免了浮点运算,速度上应该有所提升。
关注我的blog: ε==3
回复

回到 “C/C++/Java”