算法基础题目:钞票


问题描述

在这个问题中,你需要读取一个整数值并将其分解为多张钞票的和,每种面值的钞票可以使用多张,并要求所用的钞票数量尽可能少。

请你输出读取值和钞票清单。

钞票的可能面值有 100,50,20,10,5,2,1

输入格式

输入一个整数 N

输出格式

参照输出样例,输出读取数值以及每种面值的钞票的需求数量。

输入格式

0<N<1000000

输入样例:

576

输出样例:

576
5 nota(s) de R$ 100,00
1 nota(s) de R$ 50,00
1 nota(s) de R$ 20,00
0 nota(s) de R$ 10,00
1 nota(s) de R$ 5,00
0 nota(s) de R$ 2,00
1 nota(s) de R$ 1,00

初级想法

代码如下(示例):

由于题目要求所用的钞票数量尽可能少,则利用贪心的思想先从大的钞票开始计算,然后减去大的钞票所占用金额,继续向后计算金额较小的钞票所需数量。思路简单但是书写相对麻烦

#include<iostream>
using namespace std;
int main(){
    int a,b,c,d,e,f,g,h;
    cin>>h;
    a=h/100;
    b=(h-a*100)/50;
    c=(h-a*100-b*50)/20;
    d=(h-a*100-b*50-20*c)/10;
    e=(h-a*100-b*50-20*c-10*d)/5;
    f=(h-a*100-b*50-20*c-10*d-5*e)/2;
    g=h-a*100-b*50-20*c-10*d-5*e-2*f;
    printf("%d\n",h);
    printf("%d nota(s) de R$ 100,00\n",a);
    printf("%d nota(s) de R$ 50,00\n",b);
    printf("%d nota(s) de R$ 20,00\n",c);
    printf("%d nota(s) de R$ 10,00\n",d);
    printf("%d nota(s) de R$ 5,00\n",e);
    printf("%d nota(s) de R$ 2,00\n",f);
    printf("%d nota(s) de R$ 1,00\n",g);
    return 0;
}

加入数组和循环

将钞票面额按照从大到小的顺序存入数组中,依次计算

代码如下(示例):

#include<iostream>
using namespace std;
#include<cmath>
int main() {
    int m, arr[7] = { 100,50,20,10,5,2,1 };
    scanf("%d", &m);
    printf("%d\n",m);
    for (int i = 0; i < 7; i++) {
        printf("%d nota(s) de R$ %d,00\n", m / arr[i], arr[i]);
        m %= arr[i];
    }
    return 0;
}

总结

一个问题的求解通常有多种做法,简单问题亦是如此,需要多多考虑一种问题能不能有更好的做法。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值