1074:津津的储蓄计划
时间限制: 1000 ms 内存限制: 65536 KB
说明:
主要考查for循环。这是NOIP2004复赛提高组第一题,稍微有点难度。
题目概述:
津津每月初多出300元(妈妈给的)。
每月减去预算把整百存给妈妈,例如有369,就存300给妈妈,自己留69。
如果某月出现超支(预算大于自己手上的钱),则输出-X,X表示哪个月出现超支。
否则,年底津津拿回存到妈妈的钱,还拿到其中20%的津贴,并且加上津津手上的零钱。最后输出津津总共有多少钱。
思路分析:
比赛的题目描述一般都比较长,上述《题目概述》已说明关键。
输入12个月的预算应使用循环来完成,每循环一次,输入一个月的预算,同时算出是否超支,如果超支,则输出该月,并结束程序;否则把整百存给妈妈,继续循环。
循环结束后,如果12个月都没有出现超支,则算出存到妈妈的钱+其中的20%+津津手上剩余的钱。最后输出津津的全部零钱。
数据类型:每月的预算是小于350的非负整数,范围很小。而且可能出现超支,即出现负数的情况,输出的结果也是整数,所以可选int类型。
重难点:
因为在循环中输入数据,并且判断是否超支,如果超支则不必往下个月继续输入,直接输出结果并退出程序即可。当然也可以退出循环,在循环外进行条件输出。
如何退出程序或循环呢?
可以选择return 0或使用函数exit。但建议使用break关键字退出循环。
其次,在算出津津手上最终的零钱,不能忽略存到妈妈的钱,还有其中20%的津贴,都要拿回来。
然后是整百存给妈妈,应如何计算?
假设津津手上的零钱为me,那么me÷100×100就是整百了。原理:me÷100可以把个位和十位清零,只剩百位以上的数字,此时百位变为个位,最后再×100就变为整百,此时个位和十位都为0。
例如:
369÷100=3(因为整数相除不保留小数部分)
3×100=300
最后,如果整百存给妈妈,那么自己的零钱如何计算呢?
方法有两种,第一种是把原来的钱减去存给妈妈的钱;第二种是把原来的钱%100。关于%100的原理,可以参考文章:
【信奥】如何深刻理解除法和取模运算(基础篇)
求解过程:
声明3个int类型变量me = 0、mom = 0、spend,me表示津津自己,mom表示妈妈,spend表示每月的预算。
循环12次,代表12个月,循环体中:
1.津津手上多出300元,me += 300。
2.输入1个整数给变量spend,表示当月的花销预算。
3.津津手上的钱减去花销,me -= spend。
4.如果出现超支,即me < 0,则存储是哪个月份出现超支,即me = -i。并且退出循环。
5.否则,把整百的钱存给妈妈,并且计算津津剩余的零钱。
6.i++。
循环外:
如果津津的钱小于0,表示出现超支,而me保存的是超支的月份,为负数,则输出该月的负数。
否则,输出年底津津手上的所有零钱是多少。
参考代码 - C++:
12个月后算出津津手上零钱的公式:
津津手上的钱me+存给妈妈的钱mom+其中的津贴mom×20%
即:
me + mom + mom * 0.2
其中20%就是0.02,而mom + mom * 0.2可以转换为:
mom * 1.2
所以最后公式变为:
me + mom * 1.2
在最后的输出部分,如果me < 0,说明某个月超支,而在循环内把me赋值为该月的负数,所以会小于0。否则12个月都没有超支,输出津津手上的零钱。
**#include <iostream>
using namespace std;
int main()
{
int me = 0, mom = 0, spend;
for (int i = 1; i <= 12; i++)
{
me += 300; // 每个月多300元
cin >> spend;
me -= spend; // 减去预算
if (me < 0) // 如果超支
{
me = -i; // me变为-月份
break; // 退出循环,无需再计算
}
mom += me / 100 * 100; // 整百存给妈妈
me %= 100; // 自己留下零钱
}
if (me < 0) cout << me; // 如果me<0,说明超支
else cout << me + mom * 1.2; // 否则输出手上的钱
return 0;
}**
参考代码 - C语言:
注意最后输出的是整数,而运算过程含有浮点数,应转换为整数或使用"%g"的格式输出。
**
#include <stdio.h>
int main()
{
int me = 0, mom = 0, spend, i;
for (i = 1; i <= 12; i++)
{
me += 300; // 每个月多300元
scanf("%d", &spend);
me -= spend; // 减去预算
if (me < 0) // 如果超支
{
me = -i; // me变为-月份
break; // 退出循环,无需再计算
}
mom += me / 100 * 100; // 整百存给妈妈
me %= 100; // 自己留下零钱
}
if (me < 0) printf("%d", me); // 如果me<0,说明超支
else printf("%g", me + mom * 1.2); // 否则输出手上的钱
return 0;
}
**