我正在编写一个程序来查找用户输入n
中包含的所有素数。我在使用is_prime
功能时遇到问题。
#include <stdio.h>
#include <math.h>
main() {
int n;
int k;
// gets user input for length of string
// and stores it as n
printf("Enter the value of n:");
scanf("%d", &n);
for (k = 2; k <= n; k++) {
if (is_Prime(k) == 1) {
printf("Printing primes less than or equal to %d: /n %d, &n, &k");
}
}
我希望输出看起来像这样,但我不知道如何在不使用每个素数的不同变量的情况下打印列表。
Printing primes less than or equal to 30:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29.
//here is the is_Prime function
is_Prime (int n)
{
for(j = 2; j <= n/2; j++)
{
if(n%j != 0)
{
return 1;
break;
}
}
if(n%j == 0 )
return 0;
}
我不确定如何调用is_prime子例程?有什么帮助吗?
答案 0 :(得分:1)
printf("Printing primes less than or equal to %d:\n", n);
for(k = 2; k <= n; k++)
{
if(is_Prime(k) == 1)
{
printf("%d, ", k);
}
}
答案 1 :(得分:0)
printf("Printing primes less than or equal to %d:\n%s", n, (n >= 2 ? "2" : ""));
for (k = 3; k <= n; ++k)
if (is_Prime(k))
printf(", %d", k);
printf("%s\n", (n >= 2 ? "." : ""));
这里是你的is_Prime函数的一个稍微简洁的版本:
int is_Prime(int n)
{
if (n < 2)
return 0;
int last = (int) sqrt(n) + 1; /* conservatively safe */
for (int j = 2; j <= last; ++j)
if (0 == n % j)
return 0;
return 1;
}
请注意,您只需要检查一个数字的sqrt()
即可找到所有潜在因素。
另请注意,这不是查找小于n
的所有素数的好方法,这是程序的主要目的,尤其是当您每次重复调用此函数n递增1时。我建议您尝试实施Sieve of Eratosthenes或Sieve of Sundaram - 只要n
不是太大。