雷劈数,定义为:若正整数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运行结果