求N以内的偶数n,k=a+b,a^2+b^2=回文数,且a、b为质数
问题是为何这代码运行不起来?
测试输入
100
测试输出
2 2 8
11 11 242
17 23 818
#include<stdio.h>
int zhishu(int z) {
for (int ix = 2; ix <= 1000; ix = ix + 1) {
int pe = z / ix;
if (z == pe * ix && ix == z) {
return z;
}
else
return 0;
}
}
int huiwenshu(int h) {
int count=10;
int huiwen = 0;
int jishu = 0;
int zhongjian2;
int zhongjian;
int zhongjian3;
int result = 0;
int x1;
zhongjian2 = h;
do {
jishu = jishu + 1;
zhongjian2 = zhongjian2 / 10;
} while (zhongjian2 != 0);
do {
zhongjian = h / count;
x1 = h - zhongjian * count;
h = h - x1;
x1 = x1 / (count/10);
count = count * 10;
for (int pi = 1; pi < jishu; pi++) {
x1 = x1 * 10;
}
jishu = jishu - 1;
result = result + x1;
} while (zhongjian >= 10);
if (result == h)
return h;
else
return 0;
}
int main() {
int n, m, a, b, c, x, shu;
int zhongjian4;
scanf("%d", &n);
for (shu = 0; shu <= n; shu = shu + 2) {
for (int i = 2; i <= n; i = i + 1){
for (int t = 2; t <= n; t = t + 1) {
a = zhishu(i);
b = zhishu(t);
if (a != 0 && b != 0 && shu == (a + b)) {
c = huiwenshu(a*a + b * b);
if (c != 0)
printf("%d %d %d\n", a, b, c);
}
}
}
}
}
函数的实现存在问题:
zhishu函数中的第一个if语句判断条件是if (z == pe * ix && ix == z),这个条件永远不会成立,因为ix从2开始递增,pe从z/2开始递减,当ix>z/2时,pe已经变成1了,此时就不会进入if语句了。因此,这个函数永远返回0,无法正确判断一个数是否为质数。
huiwenshu函数中的第一个do-while循环计算数字的位数存在问题,应该是do { jishu = jishu + 1; zhongjian2 = zhongjian2 / 10; } while (zhongjian2 > 0);,如果是zhongjian2 != 0的话,最高位的数字不会被计算到位数中。
此外,还有一些小问题:
在主函数中,循环变量shu从0开始递增,但题目要求求的是N以内的偶数,因此应该将循环变量初始化为2,即for (shu = 2; shu <= n; shu = shu + 2)。
在主函数中,变量t的循环范围应该是for (int t = 2; t <= n; t = t + 1),因为题目要求找到a、b都是质数的情况,所以t也需要从2开始递增。
修改后的代码如下:
#include <stdio.h>
int isPrime(int z) {
if (z < 2) {
return 0;
}
for (int ix = 2; ix <= z / 2; ix = ix + 1) {
if (z % ix == 0) {
return 0;
}
}
return 1;
}
int isPalindrome(int h) {
int reversed = 0;
int original = h;
while (h > 0) {
reversed = reversed * 10 + h % 10;
h = h / 10;
}
return reversed == original;
}
int main() {
int n;
scanf("%d", &n);
for (int shu = 2; shu <= n; shu = shu + 2) {
for (int i = 2; i <= n; i = i + 1) {
for (int t = 2; t <= n; t = t + 1) {
if (isPrime(i) && isPrime(t) && shu == i + t) {
int c = i * i + t * t;
if (isPalindrome(c)) {
printf("%d %d %d\n", i, t, c);
}
}
}
}
}
return 0;
}