求N以内的偶数n,k=a+b,a^2+b^2=回文数,且a、b为质数,为啥运行不了

 求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;
}