E.找零钱

E (1204) : 找零钱

Submit Page   Summary   Discussion   Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 38     Solved: 17    


Description

现有100,50,20,10,5,2,1元的纸币,现在一个物品价值n元,问至少需要多少张钱,才可以支付该物品。

Input

输入多组数据,每组第一行输入整数n(1≤n≤9999)。

Output

输出至少需要的钱的张数,并输出方案(输出格式:币值*张数+币值*张数+….=n,币值从大到小输出,其中张数为1则无需乘以张数)

Sample Input

6
1
1000

Sample Output

2 5+1=6
1 1=1
10 100*10=100

这是一道我当时做不出来的题目

当时主要是不知道如何输出需要的钱的方案

可能是自己的算法思维还不够成熟吧

还是要多多训练和培养算法思维

//尽可能用面值大的纸币找零,就能保证所用总钱币数最少。
//
//具体说来,就是:先用面值为100的纸币找零,直到剩下需要找零的钱剩下不到100元,再用面值为50的纸币找零,直到剩下需要找零的钱剩下不到50元...以此类推,直到剩下需要找零的钱剩0元。
//
//只要把总钱数对100取余数(n%100),就能得到用100元纸币找零之后所剩下的钱,且一共用了(n/100)张100元的纸币。以此类推。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int ch[] = {100, 50, 20, 10, 5, 2, 1}, n, i, sum[10]; //sum:各面额的钱的总数
    while (~scanf("%d", &n))
    {
        int n0 = n; //保存n原本的值,备用
        for (i = 0; i < 7; i++)
        {
            sum[i] = n / ch[i];
            n %= ch[i];
        }
        int tot = 0;
        for (i = 0; i < 7; i++)
            tot += sum[i];
        printf("%d ", tot);
        n = n0;
        for (i = 0; i < 7; i++)
        {
            if (sum[i] > 0)
            {
                if (sum[i] == 1)
                    printf("%d", ch[i]);
                else
                    printf("%d*%d", ch[i], sum[i]);
                n -= sum[i] * ch[i];
                if (i < 6 && n > 0)
                    printf("+");
            }
        }
        printf("=%d\n", n0);
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZZWWWFFF_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值