Bigint Division 总是返回零

Posted

技术标签:

【中文标题】Bigint Division 总是返回零【英文标题】:Bigint Division always returning zero 【发布时间】:2017-04-20 10:54:58 【问题描述】:

我目前正在使用一个给我的 bigint 类。我已经成功地创建了加减乘法运算,但是我似乎无法破解除法运算符。

我并不热衷于获得商的余数,我只对小数点前的数字感兴趣。我还添加了一些检查。第一个是如果第二个数字为零,那么它将返回零。第二个检查是如果第二个数字大于第一个数字,我返回零,因为我对低于零的数字不感兴趣。

下面是我的代码以及到目前为止我为这个大的 int 运算符所做的工作。

Bigint operator/ (const Bigint& n1, const Bigint& n2) 

    Bigint final;
    Bigint quotient;
    int count = 0;
    Bigint result = n1;
    Bigint check;


    for(int i = 0; i < DIGITS; ++i) 
        if(n2.digits[i] == 0)

            quotient = 0;
        

        else if (n2.digits[i] > n1.digits[i])

            quotient = 0;
        

        else 

            while (result.digits[0] > 0)
                for(int i = 0; i < DIGITS; ++i)
                    result.digits[i] -= n2.digits[i];
                if(result.digits[i] < 0)
                    result.digits[i] += 10;
                    result.digits[i+1] = -1;
                
                
                count++;
            


            for(int j = 1; j < DIGITS; j++)
                final.digits[j] = count % 10;
                count = count / 10;
            
            return final;
                

            
            return final;


        

无论我在我的程序中输入什么,它总是返回一个零,我已经在这几个小时了,我一辈子都无法破解它。非常感谢任何帮助。

期望结果的一些例子是:

987654321 / 123456789 = 8
123425 / 545 = 226

干杯

【问题讨论】:

如果您在调试器中逐行执行代码并查看所有变量及其值,似乎没有什么问题?计算中的所有步骤都正确吗? 好的,那么 // 占位符代码的哪一部分:仅当 n2 为 1 时才正确 你认为我们应该忽略吗? @n.m.抱歉忽略该评论,我以为我已将其删除。 “如果第二个数字大于第一个,我返回零,因为我对零以下的数字不感兴趣”让人怀疑你是否知道除法是如何工作的。 @websafepalletone 你真的相信 0.75 小于零吗? 【参考方案1】:

我并不热衷于获得商的余数,我只对小数点前的数字感兴趣。

您需要决定要使用哪种数字以及实施哪种划分。整数没有“小数”(不管它是什么)。实数除法没有余数。

第二个检查是如果第二个数大于第一个数

您不是在检查,而是在检查第二个数字的每个数字是否大于第一个数字的相应数字。 222 和 999 会通过,但 222 和 990 会失败。

Bigint quotient;

只分配,从未使用过。

int count = 0;

这是您的最终结果(稍后您将其转换为Bigint)。如果除法的结果不适合int,它可能会溢出。那么拥有Bigint 有什么意义呢?

while (result.digits[0] &gt; 0)

这似乎根本不正确。当您在结果的最低有效位中看到 0 时,为什么要停止循环?当整体结果为零或以下时,您似乎想要停止。

result.digits[i+1] = -1;

负数?也许你想要result.digits[i+1] -= 1;

count++;

您正在实现除法的重复减法。虽然在数学上是正确的,但它相当慢。 10000000000000000000000000000 / 2 需要 loooooooooong 时间来计算。

for(int j = 1; j &lt; DIGITS; j++)

可能应该从 0 开始,就像任何好的小 for 循环一样。

【讨论】:

以上是关于Bigint Division 总是返回零的主要内容,如果未能解决你的问题,请参考以下文章

phpMyAdmin - 大的int值总是以零结尾

[CF从零单排#13]122A - Lucky Division

SendMessage 总是返回零?

DeflateStream.Read 总是返回零

PKPaymentAuthorizationViewController 总是返回零?

从 double 转换总是返回零