qq_41933131 2021-04-11 13:33 采纳率: 85.7%
浏览 70

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

 

 

  • 写回答

1条回答 默认 最新

  • 芣苢的成长之路 2023-06-27 11:28
    关注

    函数的实现存在问题:
    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;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误