You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《魔兽世界》风格C++货币系统Balance()方法的优化与Bug修复求助

《魔兽世界》风格C++货币系统Balance()方法的优化与Bug修复求助

大家好!我最近在做一个仿照《魔兽世界》的C++货币系统,包含金(Gold)、银(Silver)、铜(Copper)三种货币,兑换规则很简单:100铜兑换1银,100银兑换1金。

我先定义了这样一个结构体来处理货币:

struct Money
{
    Money();
    Money(int copper, int silver, int gold);
    Money(Money& m);
    Money operator + (Money const& obj);
    Money operator - (Money const& obj);
    void operator += (Money const& obj);
    void operator -= (Money const& obj);
    void Balance();
    void Print();
    int c, s, g;
};

现在我遇到的问题是Balance()方法的实现——这个方法的作用是把所有货币规整成符合兑换规则的格式:正数的话自动向上兑换(比如150铜转成1银50铜),负数的话要向上借位,避免出现中间层级的负数(比如(50g 10s -1c)要转换成(50g 9s 99c),绝对不能出现(50g -9s -2c)这种混乱的格式,要求只有最底层的货币可能为负,或者说负数只能通过向上借位来消解,直到最高级货币如果是负的才保留)。

我自己写了一个Balance()的实现,但总觉得性能堪忧,而且还发现了bug:当g>0、s=0但c<0的时候,代码不会正确借位,导致铜的数值还是负数,无法转换成正常的格式。

我的当前实现代码如下:

void Money::Balance()
{
    if (c > 99) { s += c / 100; c = c % 100; }
    if (s > 99) { g += s / 100; s = s % 100; }

    if (c < 0 && s >= 0 && g > 0) {
        (c += ((c / 101) + 1) * 100);
        s -= (c / -101) + 1;
    }
    if (s < 0 && g > 0) {
        (s += ((s / 101) +1) * 100);
        g -= (c / -101) + 1;
    }
}

补充说明一下:我写的最后两个if块是用来处理负数借位的,但明显逻辑有问题,比如刚才提到的s=0时的情况就处理不了。而且我总觉得这个实现的逻辑太零散,性能上也不够高效。

我想要的效果其实很明确:不管是正数还是负数,最终都要把货币转换成最规整的格式,正数自动进位,负数自动借位,不会出现中间层级的负数。现在我的代码虽然能处理部分情况,但bug和性能问题都存在,有没有大佬能帮我优化这个方法,同时修复bug呀?

备注:内容来源于stack exchange,提问作者JMelter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:49:28