用C创建程序以生成Primes

时间:2016-10-23 12:05:51

标签: c

我正在尝试生成前1000个数字的所有素数列表。我不确定我的代码在哪里出错了。从我可以告诉我的嵌套For循环不是读取正确分割/读取数组然后分配该数组正确的值。任何见解都会非常感激。该程序目前只生成所有奇数。

int main() {

    int x = 1;
    int arr[500];
    int i, j, k;
    int counter;
    int primearray[500];

    for (j=0; j <= 500; j++) {
        x += 2;
        arr[j] = x;

        for (k = 1; k <= 15; k++) {
            counter = x%k;
            if (counter == 0) {
                primearray[j] = x;
            } else {
                break;
            }
        }

        for (i = 0; i < 500; i++) {
            printf("%d ", primearray[i]);
    }
}

3 个答案:

答案 0 :(得分:1)

请花时间学习如何indent your code。选择适合您的风格并始终如一地使用它:这将使您的程序更易于阅读,反过来更容易理解。

正如我写的那样,你发布的代码甚至都没有编译,因为缺少一个大括号}:这种编辑错误是通过误导缩进来实现的。另请注意,在正确编写的C程序中,您必须记住#include使用的任何标准标头:

#include <stdio.h> // for `printf()`

而不是尝试修复你的算法,乍一看对我来说没有任何意义,我会尝试帮助你重构你的程序。

保持main()简单

鉴于您的程序的目标是检查前1000个自然数中的哪一个是素数,main()函数应该只是循环遍历这些数字并打印那些素数,如下所示:< / p>

for (int n=0; n < 1000; ++n)
    if (is_prime(n))
        printf("%d\n", n);

将它们放在一个数组而不是打印中同样容易:

int prime_array[500];   // array of primes
int k=0;                // current index in array of primes

for (int n=0; n < 1000; ++n)
    if (is_prime(n))
        prime_array[k++] = n;

在多个函数中分解程序

根据之前的想法,编写做一件事的简短函数,并做好。在您的情况下,您应该编写is_prime()函数来确定数字是否为素数。你可以从这里开始:

///
/// @brief Checks if a number is prime.
/// @param [in] n       Number to be checked
/// @returns Whether `n` is prime or not.
/// @retval 1           If `n` is prime.
/// @retval 0           If `n` is not prime.
///
int is_prime(int n)
{
    // TODO: add code here
}

决定如何检查素性

维基百科上有一篇Primality test文章,你应该阅读。

首先,您必须正确处理这些特殊情况:

  • 0不是素数
  • 1不是素数
  • 2是素数
// TODO: also check 1 and 2 in a similar fashion
if (n == 0)
    return 0;

完成此操作后,您可以使用一种天真且低效的算法来检查其他数字:

// try divisors from 2 to n-1
for (int d=2; d < n; ++d)
    if (n % d == 0)     // if the division was even,
        return 0;       // the number is not prime

return 1;               // if we get here, the number is prime

如果您想使用更快(但更复杂)的算法来检查素数,请回顾上面链接的维基百科文章。请注意你只需要更改is_prime()中的代码,程序的其余部分将保持不变。

答案 1 :(得分:0)

正如我从您的代码中了解到的那样,primearray是一系列可能的候选人,而for (k = 1; k <= 15; k++) { counter = x%k; if (counter == 0) { primearray[j] = x; } else { break; } 是一系列经过批准的候选人。没有一个候选人会被批准,所以你需要不同的变量来索引它们。

第二个问题是批准候选人的算法。从你的代码的这一部分(我改变了一些缩进)

function

如果 可以从1到15的所有整数整除,那么您批准了一个候选人 - 很抱歉,但素数没有这个属性。

答案 2 :(得分:-1)

我认为您可以参考此代码,该代码将生成所有素数,直到您指定的数字。我认为这将更加优化。

void main(){
 int n , i , j , temp=0;
 printf("Enter a number \n");
 scanf("%d",&n);
 printf(" Prime numbers -\n");
 for(i=2;i<n+1;i++)
 {
         temp=0;

         for(j=2;j<i;j++)
         {
                 if(i%j==0)
                 {
                           temp=1;
                           break;
                 }
         }
         if(temp==0)
         {
             printf("%d \n",i);
         }
 }
 getch();
}