寻找雷劈数(C实现)

雷劈数,定义为:若正整数X(在n进位下)的平方可以分割为二个数字,而这二个数字相加后恰等于X,那么X的平方就是(n进位下的)一个雷劈数,又称卡布列克数。例如55^2=3025,而30+25=55,那么3025就是一个雷劈数。

最小的雷劈数:81

问题:找到1000000以内的所有雷劈数

思路:雷劈数开方出来必然是整数,因此i从9开始(因为最小的为81,sqrt(81)=9),一直到sqrt(1000000)=1000,这样可以减少循环次数。每一次循环,先确定i^2的位数,记为count,再分别按顺序将高位和低位分别赋给left和right,最后根据雷劈数定义进行判断。

代码

#include<stdio.h>
#include<math.h>

int main() {
	int i, x, count = 0;
	int left, right;
	printf("10到1000000之内的雷劈数有:\n");
	for (i = 3; i < 1000; i++) {
		x = i * i;
		while (x) {
			x = x / 10;
			count++;
		}
		x = i * i;
		for (int j = 1; j < count; j++) {
			left = x % ((int)pow(10, j));
			right = x / ((int)pow(10, j)); //关键步骤
			if (left + right == i) {
				printf("%d\n", x);
				break;
			}
		}
	}
	return 0;
}

建议使用vs运行,我用cb运行时结果出错,可能是编译器版本问题
vs 2017运行结果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值