【问题标题】:Find if given number is prime or not查找给定数字是否为素数
【发布时间】:2014-08-05 18:30:09
【问题描述】:

我正在尝试查找 5915587277 是否为素数。 这个数字实际上是素数,我希望我的程序会这样。 当我运行这个程序时,它说它不是素数,它的除数是 199。

#include<stdio.h>

int main()
{
    long n = 0;
    long i = 0;
    printf("Enter Number: ");
    scanf("%ld", &n);
    long m = n/2;

    if(n%2 == 0)
    {
        printf("Not Prime");
        return 0;
    }

    for( i = 3; i <= m; i++)
    {
        if(n%i == 0)
        {
            printf("Not Prime: %d\n", i);
            return 0;
        }

    }

    printf("Prime");
    return 0;
}

我不知道为什么这段代码将这个数字打印为非素数。

【问题讨论】:

  • 好的,那你有什么问题?
  • 它对我有用,说它是素数。但我使用的是 64 位架构。另外,您的for 循环增量条件应该是i+=2,首先它更快;其次,如果你加 1,那么你之前的 if 就没有意义了。
  • 阅读更多关于primality test的信息。这是一个难题。
  • 5915587277 - 2^32 = 1620619981 = 199 * 8143819

标签: c primes


【解决方案1】:

您长时间超过最大值。见Data type limits

【讨论】:

  • 请参考我发布的链接。
  • 我在程序中看不到任何问题......当在 linux 机器上运行时......我收到 5915587277 作为素数
  • 我在 32 位 Windows 7 上运行这个程序
  • 来自相关链接:LLONG_MAX = 9223372036854775807,所以是的,long long int 解决了您的问题
  • @AlterMann 这是我对long int 的值。但我使用的是 64 位 Linux。
【解决方案2】:

您使用的是哪种类型的编译器?如果它支持 64 位数字,那么您可以这样做。另一件事是使用无符号长整数来存储最大值。您的代码很好,但是您需要重新了解最大值可以按特定数据类型存储的知识。 希望这个答案对您有所帮助。

【讨论】:

  • Windows 支持 64 位数字,但 long 仍然是 32 位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2023-04-05
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
相关资源
最近更新 更多