注册 登录
编程论坛 C语言论坛

编程新手求解

Leeoo 发布于 2020-04-19 23:32, 1935 次点击
问题:从键盘输入一指定金额(以元为单位,如345.78),然后显示支付该金额的各种面额人民币数量(在人民币总数量最少的情况下,显示100元、50元、10元、5元、2元、1元、1角、5分、1分各多少张)。
这道题我在百度上搜到了答案,不过我想自己用if语句写出来,但不知道为什么出错了,求助各位大佬。
代码如下:
#include<stdio.h>
int main()
{
    double x;
    int a, b, c, d, e, f, g, h, i;
    printf("请输入金额:");
    scanf_s("%lf", &x);
    if (x / 100 != 0)
    {
        a = x / 100;
        if ((x - a * 100) > 50)
        {
            b = 1;
            c = (x - a * 100 - 50) / 10;
        }
        else
        {
            b = 0;
            c = (x - a * 100) / 10;
        }
        if ((x - a * 100 - b * 50 - c * 10) >= 5)
        {
            d = 1;
            if ((x - a * 100 - b * 50 - c * 10 - 5) == 4)
                e = 2;
            else
                if ((x - a * 100 - b * 50 - c * 10 - 5) >= 2)
                    e = 1;
                else
                    e = 0;
        }
        else
        {
            d = 0;
            if ((x - a * 100 - b * 50 - c * 10) == 4)
                e = 2;
            else
                if ((x - a * 100 - b * 50 - c * 10) >= 2)
                    e = 1;
                else
                    e = 0;
        }
        if ((x - a * 100 - b * 50 - c * 10 - d * 5 - e * 2) == 1)
            f = 1;
        else
            f = 0;
        g = (x - a * 100 - b * 50 - c * 10 - d * 5 - e * 2 - f) / 0.1;
        if ((x - a * 100 - b * 50 - c * 10 - d * 5 - e * 2 - f - g * 0.1) >= 0.05)
        {
            h = 1;
            i = (x - a * 100 - b * 50 - c * 10 - d * 5 - e * 2 - f - g * 0.1 - h * 0.05) /0.01;
        }
        else
        {
            h = 0;
            i = (x - a * 100 - b * 50 - c * 10 - d * 5 - e * 2 - f - g * 0.1) / 0.01;
        }
    }
    else
        printf("error");
    printf("%2d%2d%2d%2d%2d%2d%2d%2d%2d", a, b, c, d, e, f, g, h, i);
    return 0;
}
只有本站会员才能查看附件,请 登录

最后一个数字答案是3
7 回复
#2
forever742020-04-19 23:59
浮点数有些误差很正常。
建议你用整数运算解决这个问题。
#3
rjsp2020-04-20 09:01
程序代码:
#include <stdio.h>
#include <limits.h>
#include <math.h>

int main( void )
{
    double yuan;
    if( scanf("%lf",&yuan)!=1 || yuan<0 || yuan>LONG_MAX )
        return 1;

    const long bases[] = { 10000, 5000, 1000, 500, 200, 100, 10, 5, 1 }; // 100元、50元、10元、5元、2元、1元、1角、5分、1分
    long cents = lround( yuan*100 );
    for( size_t i=0; i!=sizeof(bases)/sizeof(*bases); ++i )
    {
        printf( "%ld ", cents/bases[i] );
        cents %= bases[i];
    }
}
#4
Leeoo2020-04-20 10:12
本来最开始用的float的,后来怕精度不够,才刻意换成double的
#5
forever742020-04-20 12:17
事实上银行的系统就像3楼r版那么搞
#6
forever742020-04-20 12:22
另外楼主你对精度有误解
你的代码少付1分钱是因为3分被表达为2.999999了
你以为表达成2.9999999999999999会有啥帮助么?
(以上数字是会意表达,不是实际情况)
#7
forever742020-04-20 12:25
实在要用浮点可以在结果上加上个0.1然后再整型化,反正你又不是银行,无伤大雅。
#8
Leeoo2020-04-20 14:48
因为楼主初学C语言,好多问题还不太清楚,大家见谅哈
查了一些资料,基本上看懂了大家的回答,我自己也经过了实验,float型数字强制转换为int型的确会损失精度,谢谢大家的指导
1