标题:编程新手求解
只看楼主
Leeoo
Rank: 1
等 级:新手上路
帖 子:8
专家分:5
注 册:2020-4-19
结帖率:100%
已结贴  问题点数:20 回复次数:7 
编程新手求解
问题:从键盘输入一指定金额(以元为单位,如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
搜索更多相关主题的帖子: 编程 int printf 人民币 金额 
2020-04-19 23:32
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:10 
浮点数有些误差很正常。
建议你用整数运算解决这个问题。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-04-19 23:59
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
程序代码:
#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];
    }
}
2020-04-20 09:01
Leeoo
Rank: 1
等 级:新手上路
帖 子:8
专家分:5
注 册:2020-4-19
得分:0 
本来最开始用的float的,后来怕精度不够,才刻意换成double的
2020-04-20 10:12
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
事实上银行的系统就像3楼r版那么搞

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-04-20 12:17
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
另外楼主你对精度有误解
你的代码少付1分钱是因为3分被表达为2.999999了
你以为表达成2.9999999999999999会有啥帮助么?
(以上数字是会意表达,不是实际情况)

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-04-20 12:22
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
实在要用浮点可以在结果上加上个0.1然后再整型化,反正你又不是银行,无伤大雅。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-04-20 12:25
Leeoo
Rank: 1
等 级:新手上路
帖 子:8
专家分:5
注 册:2020-4-19
得分:0 
因为楼主初学C语言,好多问题还不太清楚,大家见谅哈
查了一些资料,基本上看懂了大家的回答,我自己也经过了实验,float型数字强制转换为int型的确会损失精度,谢谢大家的指导
2020-04-20 14:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501139-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.191445 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved