首页 > 解决方案 > 将输入金额分解为钞票的C程序

问题描述

我正在做一个练习来分解钞票中的金额,但我得到了一个浮点异常。

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

标签: c

解决方案


正如在大多数金额的评论中已经提到的那样,您会在某些时候遇到x % 0未定义的行为并且会引发错误。

改进代码的基本方法可能是这样的:

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

通过这种方式,您可以减少铸造次数,更清楚正在发生的事情,并且没有机会遇到零分裂。


推荐阅读