首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序将输入金额分解为银行票据

C程序将输入金额分解为银行票据
EN

Stack Overflow用户
提问于 2021-04-22 14:45:29
回答 2查看 249关注 0票数 0

我正在做一项工作,用钞票来分解一笔钱,但我得到了一个浮点数的例外。

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int amount, n100, n50, n20, n10, n5, n2, n1;

    printf("Input the amount: \n");
    scanf("%i", &amount);

    n100 = amount / 100;
    n50 = (amount % 100) / 50;
    n20 = (int)(n50 % (amount % 100)) / 20;
    n10 = (int)(n20 % (n50 % (amount % 100))) / 10;
    n5 = (int)(n10 % (n20 % (n50 % (amount % 100)))) / 5;
    n2 = (int)(n5 % (n10 % (n20 % (n50 % (amount % 100))))) / 2;
    n1 = (int)(n2 % (n5 % (n10 % (n20 % (n50 % (amount % 100)))))) / 1;
    
    printf("%i Note(s) of 100.00\n", n100);
    printf("%i Note(s) of 50.00\n", n50);
    printf("%i Note(s) of 20.00\n", n20);
    printf("%i Note(s) of 10.00\n", n10);
    printf("%i Note(s) of 5.00\n", n5);
    printf("%i Note(s) of 2.00\n", n2);
    printf("%i Note(s) of 1.00\n", n1);

    return 0;   
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-22 15:11:26

在干原理下,用数组来表示面额和计数如何?

每当我看到(例如) v1, v2, v3, ..., vN时,它就会“呼喊”一个数组。

对于这个用例,这可能不是很明显。但是,如果N是一个很大的数字(例如1000),就会更容易看出。也就是说,我们有一个包含1000个元素的数组变量,而不是1000个单独的变量。

代码语言:javascript
复制
#include <stdio.h>

#define COUNTOF(_arr)       (sizeof(_arr) / sizeof(_arr[0]))

int denoms[] = { 100, 50, 20, 10, 5, 2, 1 };
#define COUNT   COUNTOF(denoms)

int counts[COUNT];

int
main(void)
{
    int amount;

    printf("Input the amount: ");
    fflush(stdout);
    scanf("%d",&amount);

    int value = amount;
    for (int idx = 0;  idx < COUNT;  ++idx) {
        int denom = denoms[idx];
        counts[idx] = value / denom;
        value %= denom;
    }

    for (int idx = 0;  idx < COUNT;  ++idx) {
        int count = counts[idx];
        if (count)
            printf("%d Notes of %d.00\n",count,denoms[idx]);
    }

    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2021-04-22 14:58:33

正如在大多数数量的注释中已经提到的,您将在某个时候遇到一个x % 0,这是一个未定义的行为,并且会抛出一个错误。

改进代码的基本方法可以如下所示:

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int amount, n100, n50, n20, n10, n5, n2, n1;
    int rest;

    printf("Input the amount: \n");
    scanf("%i", &amount);

    n100 = amount / 100;
    rest = amount % 100;
    
    n50 = rest / 50;
    rest = rest % 50;
    
    n20 = rest / 20;
    rest = rest % 20;
    
    n10 = rest / 10;
    rest = rest % 10;
    
    n5 = rest / 5;
    rest = rest % 5;
    
    n2 = rest / 2;
    rest = rest % 2;
    
    n1 = rest;
    
    printf("%i Note(s) of 100.00\n", n100);
    printf("%i Note(s) of 50.00\n", n50);
    printf("%i Note(s) of 20.00\n", n20);
    printf("%i Note(s) of 10.00\n", n10);
    printf("%i Note(s) of 5.00\n", n5);
    printf("%i Note(s) of 2.00\n", n2);
    printf("%i Note(s) of 1.00\n", n1);

    return 0;   
}

这样你就少得多的铸造,这是更清楚的发生了什么,没有机会遇到零分割。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67215538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档