如何在 C 中使用 for 循环找到给定数字的最近素数?
How to find the nearest prime for a given number using for loop in C?
我真的试过了,但仍然不知道我的代码有什么问题。
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int minus, i, judge;
for (minus = 0, judge = 1; judge == 1; minus++, n -= minus) {
for (i = 2; i * i < n; i++) {
if (n % i == 0)
judge = 1;
else judge = 0;
}
if (judge == 1)
continue;
else break;
}
printf("%d\n", n);
return 0;
}
当我输入 143 时,输出是 143 而不是 139。
但是,当我输入 11 时,输出的是正确答案 11.
循环测试不正确:for (i = 2; i * i < n; i++)
如果 n
是质数的平方,循环将在找到因数之前停止。
您应该使用 i * i <= n
或 i <= n / i
。
此外,当您在每次迭代中递减 n
递增的值时,您不会枚举所有数字。
另请注意,循环不会找到最接近 n
的素数,而是找到小于 n
的最大素数,这并不完全相同。
这是修改后的版本:
#include <limits.h>
#include <stdio.h>
int isPrime(int n) {
if (n <= 2 || n % 2 == 0)
return n == 2;
for (int i = 3; i <= n / i; i += 2) {
if (n % i == 0)
return 0;
}
return 1;
}
int main() {
int n;
if (scanf("%d", &n) != 1)
return 1;
if (n <= 2) {
printf("2\n");
} else {
for (i = 0;; i++) {
if (isPrime(n - i))
printf("%d\n", n - i);
break;
}
if (n <= INT_MAX - i && isPrime(n + i))
printf("%d\n", n + i);
break;
}
}
}
return 0;
}
我真的试过了,但仍然不知道我的代码有什么问题。
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int minus, i, judge;
for (minus = 0, judge = 1; judge == 1; minus++, n -= minus) {
for (i = 2; i * i < n; i++) {
if (n % i == 0)
judge = 1;
else judge = 0;
}
if (judge == 1)
continue;
else break;
}
printf("%d\n", n);
return 0;
}
当我输入 143 时,输出是 143 而不是 139。 但是,当我输入 11 时,输出的是正确答案 11.
循环测试不正确:for (i = 2; i * i < n; i++)
如果 n
是质数的平方,循环将在找到因数之前停止。
您应该使用 i * i <= n
或 i <= n / i
。
此外,当您在每次迭代中递减 n
递增的值时,您不会枚举所有数字。
另请注意,循环不会找到最接近 n
的素数,而是找到小于 n
的最大素数,这并不完全相同。
这是修改后的版本:
#include <limits.h>
#include <stdio.h>
int isPrime(int n) {
if (n <= 2 || n % 2 == 0)
return n == 2;
for (int i = 3; i <= n / i; i += 2) {
if (n % i == 0)
return 0;
}
return 1;
}
int main() {
int n;
if (scanf("%d", &n) != 1)
return 1;
if (n <= 2) {
printf("2\n");
} else {
for (i = 0;; i++) {
if (isPrime(n - i))
printf("%d\n", n - i);
break;
}
if (n <= INT_MAX - i && isPrime(n + i))
printf("%d\n", n + i);
break;
}
}
}
return 0;
}