新手求救!难道(money / 100) * 100 * 1.2和(money / 100) * 120不一样?

WYHMingMing 2021-02-08 01:21:02
最近我正在跟着一本书——《信息学奥赛一本通(C++版)》学习C++,书后练习题中有一道题如下:

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销与预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制订了一个储蓄计划:每个月每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多余100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如,11月初津津手中有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元.到了11月末,津津手中会剩下3元钱。
现在请你根据2020年1月到12月每个月津津的预算,计算到2020年末,妈妈将津津平常存的钱加上20%还给津津后,津津手中会有多少钱。
输入:
包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。
输出:
只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第1个月;否则输出到2020年末津津手中会有多少钱。
样例输入1:
290
230
280
200
300
170
340
50
90
80
200
60
样例输出1:
-7

样例输入2:
290
230
280
200
300
170
330
50
90
80
200
60
样例输出2:
1580

我的程序如下:

# include <cstdio>
using namespace std;
int main()
{
int money = 0, budget, deposit = 0, back = 0, result = 0;
//分别定义money(津津手里的钱),budget(每月预算)、deposit(津津存到妈妈手里的钱)、back(最后妈妈连本带息还给津
//津的钱)和result(最终津津手里有多少钱)
for (int i = 1; i <= 12; ++i) //利用for循环输入12遍月预算
{
money += 300; //每月妈妈给津津零花钱300元
scanf("%d", &budget); //用户输入该月预算
money -= budget; //求出抛去该月预算还剩多少钱
if (money < 0) //判断钱是不是不够了
{
printf("%d\n", -i);
return 0; //输出-X,结束程序
}
else
{
deposit += ((money / 100) * 100);
money %= 100; //(问题在这)求出剩余钱当中有多少整百的钱,存入妈妈那里(deposit增加,money减少)
}
}
back = deposit * 1.2; //(问题在这)连本带息还给津津1.2倍的钱
result = back + money; //加上津津12月手里还剩的钱就是最终结果
printf("%d\n", result);
return 0; //结束程序
}

那本书有一个配套的测评网站——http://ybt.ssoier.cn:8088/,我把程序传输上去之后说不对,我很迷茫,检查多遍后查看参考答案,答案如下:

【参考程序】
#include <iostream>
#include <cstdio>
using namespace std;
int x; int i,n,t; bool f=1;
int main()
{
t=0; n=0; //t存津津留在手里的钱,n存津津存在妈妈手里的钱,初始值均赋为0
for(i=1;i<=12;++i)
{
scanf("%d",&x);
t=t+300-x;
if (t<0)
{
printf("%d\n",-i);
return 0;
}
if (t>=100)
{
n=n+t/100; t%=100;
}
}
printf("%d\n",n*120+t);
return 0;
}

我看完很纳闷,答案和我没区别呀?经过多次测试我发现,测评网站认为我先*100再*1.2不对,应该像答案一样直接乘120,这两个难道不是一样的吗???100*1.2=120呀?!是不是因为乘1.2之后类型变了或者不符了???

求助各位大佬,感谢!!!十分感谢!!!
...全文
253 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
WYHMingMing 2021-02-16
  • 打赏
  • 举报
回复
引用 8 楼 oldnew32 的回复:
数据类型转换需要注意。如果都是浮点数计算,遇到整数常数时,最后写8.0,3.0之类。
感谢大佬!!感谢!
快乐胖电工 2021-02-12
  • 打赏
  • 举报
回复
数据类型转换需要注意。如果都是浮点数计算,遇到整数常数时,最后写8.0,3.0之类。
WYHMingMing 2021-02-11
  • 打赏
  • 举报
回复
引用 6 楼 YueQiong 的回复:
[quote=引用 4 楼 xian0-666 的回复:]涉及小数的东西全部弄成float,因为一不小心就会出错,下图一个简单的例子,1.4 * 5是等于7的,但是系统不那么认为,他可能认为等于7.00000001或者6.9999999,应判断abs(xxx - float)< 0.0000001.
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	float a = 1.4,b = 5,c = 7;
	int i = 7;
	cout << (a * b == i) << endl;
	return 0;
}
他说的很对嗷~楼主要注意下次在程序中注意整数类型和浮点类型[/quote] 感谢感谢。十分感谢!!!
YueQiong 2021-02-11
  • 打赏
  • 举报
回复
引用 4 楼 xian0-666 的回复:
涉及小数的东西全部弄成float,因为一不小心就会出错,下图一个简单的例子,1.4 * 5是等于7的,但是系统不那么认为,他可能认为等于7.00000001或者6.9999999,应判断abs(xxx - float)< 0.0000001.
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	float a = 1.4,b = 5,c = 7;
	int i = 7;
	cout << (a * b == i) << endl;
	return 0;
}
他说的很对嗷~楼主要注意下次在程序中注意整数类型和浮点类型
WYHMingMing 2021-02-09
  • 打赏
  • 举报
回复
引用 4 楼 xian0-666 的回复:
涉及小数的东西全部弄成float,因为一不小心就会出错,下图一个简单的例子,1.4 * 5是等于7的,但是系统不那么认为,他可能认为等于7.00000001或者6.9999999,应判断abs(xxx - float)< 0.0000001.
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	float a = 1.4,b = 5,c = 7;
	int i = 7;
	cout << (a * b == i) << endl;
	return 0;
}
感谢感谢!!!感谢大佬!!!
xian0-666 2021-02-09
  • 打赏
  • 举报
回复
涉及小数的东西全部弄成float,因为一不小心就会出错,下图一个简单的例子,1.4 * 5是等于7的,但是系统不那么认为,他可能认为等于7.00000001或者6.9999999,应判断abs(xxx - float)< 0.0000001.
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	float a = 1.4,b = 5,c = 7;
	int i = 7;
	cout << (a * b == i) << endl;
	return 0;
}
WYHMingMing 2021-02-09
  • 打赏
  • 举报
回复
引用 1 楼 Simple-Soft 的回复:
你们俩的都是不太好的,数据类型不应该用int,至少要用float型的。比如100*1.2等于120是没有错的,但是如果3*1.2呢?
那为什么我的就错了呢? 感谢!
WYHMingMing 2021-02-08
  • 打赏
  • 举报
回复
引用 1 楼 Simple-Soft 的回复:
你们俩的都是不太好的,数据类型不应该用int,至少要用float型的。比如100*1.2等于120是没有错的,但是如果3*1.2呢?
感谢指点!感谢感谢!!!
Simple-Soft 2021-02-08
  • 打赏
  • 举报
回复
你们俩的都是不太好的,数据类型不应该用int,至少要用float型的。比如100*1.2等于120是没有错的,但是如果3*1.2呢?

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧