【问题标题】:range of long int, long long int and intlong int、long long int 和 int 的范围
【发布时间】:2018-06-29 09:06:33
【问题描述】:

我必须打印数组 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 操作系统,我给出的输入是 3 位数字 作为数组元素,例如 568,253 等,开头没有任何 0。

【问题讨论】:

  • 您的标题提到了long long int,但您的问题并未提及该类型。也许从 Monika 的标题中删除它?
  • limits of integer types&lt;limits.h&gt; 头文件中定义。您还可以使用 sizeof 运算符非常轻松地检查限制,因为它会告诉类型使用的字节数,然后可以将其转换为定义范围的位数。请记住,标准整数类型的大小可能因系统、平台、编译器而异,甚至在不同平台上的同一编译器之间也可能不同。
  • 真正的问题是int 在您的特定系统上的大小。在具有 32 位整数的系统上,我不希望 long int 改变任何东西。您使用的是嵌入式系统还是 Turbo C 之类的旧 DOS 垃圾?
  • 可能你的系统默认intshort int。否则int arr[N]long int arr[N] 与默认int 相同,即long in 32 bitsystem。
  • 也许它与限制无关,但与“%i”有关。看看这是否有帮助:geeksforgeeks.org/difference-d-format-specifier-c-language

标签: c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题可能是表达式(pro*arr[i]) 的结果。 如果我们假设 pro 的最大值是 1000000006 由于模数,arr[i] 的最大值是 10^3 如上所述。所以,这个表达式可能会取一个大于 32 位整数的值。

    另外要查找的是 (pro * arr[i]) 的类型是什么?

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

    如果您将arr[] 设置为long int [],则此表达式将返回一个长整数,而如果您将arr[] 设置为int,它将返回一个int,因此会出错:

    int * int -> int
    int * long int -> long int
    

    【讨论】:

    • 呃,什么?为什么arr[i] 限制为 10^3?此外,大多数答案令人困惑......常量1000000006 是int 类型,在这种情况下arr[i] 将适合最多2 ^ 31-1 的数字,并且不会发生此错误。或者常量是long类型,在这种情况下操作数arr[i]将被提升为long,计算由long完成,然后被截断回int。
    • @Lundin 这是一个竞争性编程问题,提供了上限约束。
    • 这解释了为什么您已经“修复”了您的问题,但这样做却使您的阵列不必要地变大了。通过将pro 声明为大整数,您将获得相同的“修复”,这可能是可以接受的。但理想的解决方法是保持数组元素尽可能小,但在进行乘法之前立即将内容转换为更大的 int:pro*(long long int)arr[i]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2011-05-08
    • 1970-01-01
    • 2020-09-03
    • 2016-07-29
    • 2018-05-10
    相关资源
    最近更新 更多