1074:津津的储蓄计划

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;
}

**

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值