我正在尝试生成前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]);
}
}
答案 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文章,你应该阅读。
首先,您必须正确处理这些特殊情况:
// 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();
}