【问题标题】:How to cope with int overflow如何应对int溢出
【发布时间】:2014-01-06 16:44:49
【问题描述】:

我有这段代码,我试图避免 int 类型的溢出。当我输入 {1000000,1000000} 我得到的是 0 而不是 1。这是由于 int 类型的溢出引起的。我正在尝试以某种方式投射它,但它不起作用,请帮忙。

最好的问候!

#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

class SplitIntoPairs {
public:
    int makepairs(vector<int> A, int X)
    {

        int s = 0;
        sort(A.begin(), A.end());

        for (int i = 0; i < A.size() - 1; i += 2) {
            int k = A[i] * A[i + 1]; //bool b = true;
            if (A[i] * A[i + 1] > 2147483647) {
                k = (long long)(k);
                //  b=false;
            }
            if (k >= X)
                ++s;
        }
        //return the created int
        return s;
    }
};

【问题讨论】:

    标签: c++ casting int overflow long-integer


    【解决方案1】:

    A[i] * A[i + 1] 正在执行整数运算,因此它会在 A 中溢出较大的值,从而导致与 2147483647 在强制转换之前的比较无法正常工作。

    如果您在执行乘法之前将 A 中的值转换为 long,您甚至不需要比较。例如:

    long long k = (long long)(A[i]) * (long long)(A[i + 1]);
    if (k >= X)
        ++s;
    

    【讨论】:

      【解决方案2】:

      您选择了正确的方向 - 以 64 位整数存储产品,但您必须考虑将 32 位整数相乘会得到 32 位整数。您只需在乘法前将 32 位整数转换为 64 位整数

      int makepairs(std::vector<int> A, int X)
      {
          int s = 0;
          sort(A.begin(), A.end());
      
          for (int i = 0; i < A.size() - 1; i += 2) {
              long long k = ((long long) A[i]) * A[i + 1];        
              if (k >= X)
                  ++s;
          }
          //return the created int
          return s;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多