C 输入大数字时命令终止

C 输入大数字时命令终止,c,primes,sieve-of-eratosthenes,C,Primes,Sieve Of Eratosthenes,当我试图输入一个大数字(大约1000万)时,为什么会收到“命令终止”的消息?程序显示该数字是否为素数 见下面的代码: #include <stdlib.h> #include <stdio.h> #include <stdbool.h> int main ( int argc, char *argv[] ) { unsigned long long number; bool prime ( unsigned long long ); pr

当我试图输入一个大数字(大约1000万)时,为什么会收到“命令终止”的消息?程序显示该数字是否为素数

见下面的代码:

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

int main ( int argc, char *argv[] )
{
   unsigned long long number;
   bool prime ( unsigned long long );

   printf ("Enter a positive integer greater than 1: ");
   scanf ("%llu", &number );

   prime( number ) ?
      printf ( "%llu is a prime.\n", number ):
      printf ( "%llu is not a prime.\n", number);

   return EXIT_SUCCESS;
}

bool prime ( unsigned long long number )
{
   unsigned long long i, j;
   bool isPrime[number + 1];

   for ( i = 2; i <= number; i++ )
      isPrime[i] = true;

   for ( i = 2; i <= number - 1; i++ )
      for ( j = 1; i*j <= number; j++ )
         isPrime[i*j] = false;

   return isPrime[number];
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
无符号长数字;
布尔素数(无符号长-长);
printf(“输入大于1的正整数:”;
scanf(“%llu”、&number);
素数?
printf(“%llu是素数。\n”,数字):
printf(“%llu不是素数。\n”,数字);
返回退出成功;
}
布尔素数(无符号长整数)
{
无符号长i,j;
bool-isPrime[number+1];

对于(i=2;i而言,问题在于您试图在堆栈上创建一个大于可用内存的数组
isPrime
。您应该在堆上创建它,使用

bool *isPrime;
isPrime = malloc((number + 1) * sizeof *isPrime);
显然,只执行一次,而不是每次调用函数
prime

还要注意,如果你只想知道一个数字是否是素数,你只需要搜索一个因子的平方根,如果你找到了一个因子,你就完成了。这使得你必须创建的数组的大小更易于管理,但它确实涉及到对算法的一些更改

事后思考您在确定什么是素数的逻辑中有一个问题-您的内部循环以
j=1开始
,这意味着即使是素数也将被标记为非素数。以下是“略微改进”的代码-尽管您可以做更多的工作来使其更好:

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <math.h>

int main ( int argc, char *argv[] )
{
   unsigned long long number;
   bool prime ( unsigned long long );

   printf ("Enter a positive integer greater than 1: ");
   scanf ("%llu", &number );

   prime( number ) ?
      printf ( "%llu is a prime.\n", number ):
      printf ( "%llu is not a prime.\n", number);

   return EXIT_SUCCESS;
}

bool prime ( unsigned long long number )
{
   unsigned long long i, j, sq;
   bool *isPrime;
   sq = ceil(sqrt(number));
   isPrime = malloc((sq + 1)*sizeof *isPrime);

   // generate primes up to the square root of the number
   for ( i = 2; i <= sq; i++ )
      isPrime[i] = true;

   for ( i = 2; i < sq; i++ ) {
      // only need to mark multiples if this is a prime:
      if(isPrime[i]) {
        // start this loop at 2, not 1!
        for ( j = 2; i*j <= sq; j++ ) {
          isPrime[i*j] = false;
        }
      }
    }

   for ( i = 1; i < sq; i++)
   {
    if (isPrime[i] && number%i==0) return false;
   }

   return true;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
无符号长数字;
布尔素数(无符号长-长);
printf(“输入大于1的正整数:”;
scanf(“%llu”、&number);
素数?
printf(“%llu是素数。\n”,数字):
printf(“%llu不是素数。\n”,数字);
返回退出成功;
}
布尔素数(无符号长整数)
{
无符号长i,j,sq;
bool*isPrime;
sq=ceil(sqrt(数量));
iPrime=malloc((sq+1)*sizeof*iPrime);
//生成数的平方根以下的素数

对于(i=2;i行)代码Boo-IsHelp [编号+1 ] < /C>未编译错误?@ BalkMaNOS C,而不是C++(C99支持可变长度数组)至少对我来说,是的。我正在使用GCC。@Marca:这两种方法都适用!无论如何,可能没有足够的堆栈空间来容纳1000万
bool
数组。你可能是在破坏堆栈/同意,我得到了stackoverflow:)非常感谢你的帮助!:)