以下程序中的整数溢出,最大int 1000 000(在int范围内)

时间:2019-01-09 19:13:41

标签: 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范围内

1 个答案:

答案 0 :(得分:2)

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

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

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

unsigned long long n;

通过将n的类型更改为unsigned long long,由于计算的第一步是在unsigned long long上进行的,因此计算的每个步骤都将是n的类型