long int,long long int和int的范围

时间:2018-06-29 09:06:33

标签: c

我必须打印数组A mod 10^9+7的元素的乘积,数组中应该有N个元素,约束是1<=N<=10^31<=A[i]<=10^3

我写的代码

#include<stdio.h> 
int main()
{
    int N, pro = 1;
    scanf("%i", &N);
    int arr[N];
    for (int i = 0; i<N; i++) {
        scanf("%i", &arr[i]);
        pro = (pro*arr[i]) % (1000000007);
    }      
    printf("%i", pro);
}

给出了错误的答案,但是当我将int arr[N]替换为long int arr[N]并将其精度说明符更改为%li时,它给出了正确的输出。 我的困惑是,当数组元素的上限仅为10^3时,为什么要使用long int而不是int呢? 我正在使用64位Windows OS,输入的是3位数字 作为数组元素,例如568,253等,开头没有任何0。

2 个答案:

答案 0 :(得分:1)

问题可能是表达式(pro*arr[i])的结果。 如果我们假设pro的最大值由于取模而为 1000000006 ,而arr[i]的最大值为 10 ^ 3 。因此,该表达式的值可能大于32位整数。

要寻找的另一件事是 (pro * arr[i])的类型是什么?

编译器通过查看表达式的操作数来回答这个问题,并将返回类型(对于整数)设置为更大的类型。

如果将arr[]设置为long int [],则此表达式将返回一个长整数,而如果将arr[]设置为int,则它将返回一个{{ 1}},所以它是错误的:

int

答案 1 :(得分:1)

考虑N = 3且A = [10 ^ 3,10 ^ 3,10 ^ 3]的情况。 在第二次迭代之后,您的乘积将为10 ^ 9。 在第三次迭代中,您的乘积将为(10 ^ 9 * 10 ^ 3)%1000000007。 在进行模运算之前,乘积将创建整数溢出,从而产生WA。

相关问题