题目来源:蓝桥杯2013初赛 C++ A组B题
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明正看着 203879 这个数字发呆。
原来,203879∗203879=41566646641。
这有什么神奇呢?仔细观察,203879 是个 6 位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的 6 位数还有一个,请你找出它!
再归纳一下筛选要求:
问题分析
枚举6位数,最小的各位数字不同的6位数是123456, 最大的各位数字不同的6位数是987654。
根据进制原理判定6位数是否有重复的数字。
根据进制原理判定平方数的数字是否与6位数的数字重合。
AC的C语言程序如下:
/* LQ0203 排它平方数 */
#include
#include
char cnt[10];
int main()
{
for (int i = 123456; i <= 987654; i++) {
memset(cnt, 0, sizeof cnt);
int t = i, flag = 0;
while (t) {
if (++cnt[t % 10] > 1) {
flag = 1;
break;
}
t /= 10;
}
if (flag) continue;
long long p = (long long) i * i;
while (p) {
if (cnt[p % 10]) {
flag = 1;
break;
}
p /= 10;
}
if (flag == 0 && i != 203879)
printf("%d\n", i);
}
return 0;
}