我必须打印数组A mod 10^9+7
的元素的乘积,数组中应该有N
个元素,约束是1<=N<=10^3
和1<=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。
答案 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。