【问题标题】:Variable too large and results in wrong answer变量太大导致错误答案
【发布时间】:2020-04-29 20:46:36
【问题描述】:

我一直试图找到一种方法来存储这个算术的结果几个小时。

我了解数据太大而无法存储。但我的编译器似乎支持的最大数据类型是 unsigned long long。

#include <iostream>
#include <iomanip>
#include <limits>
using namespace std;

int main() {
   int num1 = 100000;
   int num2 = 200000;
   int num3 = 300000;
   double num4 = 500000.00;
   unsigned long long product = (num1 * num2 * num3 * num4);

   cout << fixed << setprecision(3) << product << endl;

   // Answer should be 3000000000000000000000.000
   // Result is 18446447556077551616
   return 0;
}

【问题讨论】:

  • 您可能需要一个支持任意大整数及其有理数的库。 (或者实现你自己的)
  • 这能回答你的问题吗? How to store extremely large numbers?
  • 好吧,我的主要限制是我必须使用在线编译器,因为这是一个类。
  • 也许使用 BigIntegers?我记得在 Java 中使用它们来解决 Project Euler 问题。 (对于尺寸过大的数字)

标签: c++


【解决方案1】:

假设:整数是 32 位的。 long long 是 64 位的。

64位无符号的最大值是:

  18446744073709551615

你正在尝试计算:

3000000000000000000000

不适合任何 64 位整数(有符号或无符号)

让我们也分解一下这个问题:

num1num2num3是整数,三个整数相乘的表达式

   num1 *   num2 *   num3
 100000 * 200000 * 300000

作为一个整数表达式num1*num2*num3 已经溢出了您要与之相乘的值。那是在我们乘以num4之前。

更好的解决方案是将 num1、num2 和 num3 声明为 long long,以便将上述表达式计算为相同的类型。

但即使使用此修复程序,6 万亿乘以 500000.0 的乘法也会被计算为双精度数。这仍然会溢出 double 和 64 位有符号范围。

简短回答:您将需要一个大数字数学库来评估此范围内的数字。

【讨论】:

    【解决方案2】:

    这里是你真正如何用符号转换高数或添加变量计数器。

    #include <iostream>
    #include <iomanip>
    using namespace std;
    #include <stdio.h>
    #include <math.h>
    
    int main() {
         int num1;
         int num2;
         int num3;
         int num4;
         int check1;
         double check2;
    
         cin >> num1 >> num2 >> num3 >> num4;
       
         cout << (num1 * num2 * num3 * num4) << " " << (num1 + num2 + num3 + num4)/4 << endl;
        
         check2 = static_cast<double>((num1 + num2 + num3 + num4)/4.000);
       
    if (num1 > (pow(10, 4))){
          num1 = num1 / (pow(10, 5));
          num2 = num2 / (pow(10, 5));
          num3 = num3 / (pow(10, 5));
          num4 = num4 / (pow(10, 5));//note math to add 0 is (5+5+5+5) 20 (0)s
          check1 = (num1 * num2 * num3 * num4);
          cout << check1 << "00000000000000000000.000";
          cout<< setprecision(3) << fixed;
          cout << " " << static_cast<double>(check2) << endl;
       }
       else{
          check1 = (num1 * num2 * num3 * num4)+ .00001; 
          cout<< setprecision(3) << fixed;  
          cout << static_cast<double>(check1) << " " << static_cast<double>(check2) << endl;
    }
       return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-18
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多