问题描述
我确实尝试过,但仍然不知道我的代码出了什么问题。
#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;
}