2017-04-20 95 views
0

我目前正在使用一个给我的bigint类。我成功地创建了加法减法和乘法操作,但我似乎无法破解除法运算符。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 

干杯

+1

如果您逐行浏览调试器中的代码,逐行查看所有变量及其值,看起来什么都没有关闭?计算中的所有步骤都是正确的? –

+0

好的,那么** //占位符代码的哪一部分:只有当n2是1时才正确**你认为我们应该忽略吗? –

+0

@ n.m。对不起,忽略那个评论,我以为我已经删除它。 – websafepalletone

回答

1

我没有大惊小怪上得到的商余,我只是在之前的十进制数感兴趣。

您需要确定您正在尝试使用哪种数字以及您实施哪种划分。整数没有“小数”(不管它是什么)。实数部分没有余数。

第二检查,如果是,如果第二数量比第一

你是不是检查,要检查的是,第二个数字的每个数字比的对应数字的大于第一个号码。 222和999会通过,但222和990会失败。

Bigint quotient;

只分配,从未使用。

int count = 0;

这是你最后的结果(将其转换为Bigint更高版本)。如果除法的结果不符合int,它可能会溢出。那么Bigint有什么意义呢?

while (result.digits[0] > 0){

这似乎不是正确的。为什么在结果的最低有效位中看到0时停止循环?当整体结果为零或更低时,它看起来像停止。

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

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

count++;

您正在实施分工的重复扣除方法。尽管数学上正确,但速度很慢。 1000000000000000000000000000/2将需要loooooooooong时间来计算。

for(int j = 1; j < DIGITS; j++){

或许应该从0开始,像任何好一点for循环。