c++ - 下面程序中的整数溢出最大 int 1000 000(在 int 范围内)

标签 c++

我正在解决 spoj 上的问题,SPOJ CARDS 问题很简单,我得到了小数字的正确输出,但由于整数溢出,spoj 似乎不接受, 那么我应该使用什么整数类型?

或者是否还有其他问题他们不接受?我也不知道可能失败的测试用例

其他人似乎使用相同逻辑的一些已接受的解决方案,并且该解决方案已被接受accepted sol

测试用例:

      2
      3
      7

输出:

      15
      77

.

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int t;
        cin>>t;
        while(t--){
            int n;
            cin>>n;
            unsigned long long int sum1=0;
            unsigned long long int sum2=0;
            sum1=((n*(n-1))/2)%1000007;
          //  cout<<"sum1 is"<<sum1;
            sum2=(n*n+n)%1000007;
            cout<<(sum1+sum2)%1000007<<endl;

        }

    }

编辑

当我使用 unsigned long long n 但 n 的最大值是时,答案得到接受 1000 000 那么它也应该在 int n 中被接受,因为 nmax 在 int 的范围内

最佳答案

n 时,您的代码在 n * (n - 1)n * n 乘法中溢出了 int 的范围 很大。

这与操作顺序有关。例如,(n * n + n) % 1000007; 这里,首先计算n * n。结果大于 int 的容纳范围,因此会出现整数溢出。由于溢出,生成的 int 值小于应有的值。对于这个太小的值,添加了n。这会导致另一个太小的int。这个太小的值除以2。最后执行%

一个简单的解决方法是像这样声明 n:

unsigned long long n;

通过将n的类型更改为unsigned long long,计算中的每一步都将是unsigned long long类型,自第一个步骤的计算是在n上进行的。

关于c++ - 下面程序中的整数溢出最大 int 1000 000(在 int 范围内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54116813/

相关文章:

C++ lambda 代表

c++ - 简单程序中奇怪的引用传递问题

c++ - 盈透证券 C++ 错误 : error: 'min' was not declared in this scope

c++ - 循环类型定义

c++ - 如何遍历通过引用传递的多个对象?

c++ - 将数组从 RAM 复制到 GPU 以及从 GPU 复制到 RAM

c++ - 为什么 "extern int &c;"工作正常?

c++ - 有效地移动整个内存块

c++ - BitmapEx.h 的问题

c++ - 使用 boost - 将它放在源代码管理中还是让任何开发人员自己安装?