当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]问个c程序100例里面一个程序的问题
帖子发表于 : 2007-06-07 18:35 
头像

注册: 2007-04-11 10:39
帖子: 319
送出感谢: 0 次
接收感谢: 0 次
尝试过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
求解~谢谢


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-06-12 12:01 
头像

注册: 2007-04-11 10:39
帖子: 319
送出感谢: 0 次
接收感谢: 0 次
郁闷
70多个人看过了
可是还是没人回答
难道是我写得不够详细。。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-06-12 12:42 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
运算过程中需要用浮点型的数据,float或者double应该都可以满足你的要求。


_________________
关注我的blog: ε==3


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-06-12 14:02 
头像

注册: 2007-03-01 21:04
帖子: 283
地址: 福建
送出感谢: 0 次
接收感谢: 0 次
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来计算.


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-06-12 15:05 
头像

注册: 2007-04-11 10:39
帖子: 319
送出感谢: 0 次
接收感谢: 0 次
感谢ls的2位~~
呵呵
万分感谢
:D :D :D :D :D


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-06-13 13:02 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
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


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译