我确实尝试过,但仍然不知道我的代码出了什么问题。
#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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句