题目:小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
- 6位正整数
- 每个数位上的数字不同
- 其平方数的每个数位不含原数字的任何组成数位
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool check(long long x, long long xx) {
char str1[10];
char str2[20];
lltoa(x, str1, 10);//将整数x按十进制转化为字符串str1
lltoa(xx, str2, 10);
for (int i = 0; str1[i] != '\0'; i++) {
for (int j = 0; str2[j] != '\0'; j++) {
if (str1[i] == str2[j])
return false;
}
}
return true;
}
/* check函数的功能:排查6位数x各位数上的数字与其平方xx各位上的数字是否重合*/
int main() {
long long a, b, c, d, e, f;
for (a = 1; a < 10; a++) {
for (b = 0; b < 10; b++) {
if (b != a)
for (c = 0; c < 10; c++) {
if (c != a && c != b)
for (d = 0; d < 10; d++) {
if (d != a && d != b && d != c)
for (e = 0; e < 10; e++) {
if (e != a && e != b && e != c && e != d)
for (f = 0; f < 10; f++) {
if (f != a && f != b && f != c && f != d && f != e) {
long long x = a * 100000 + b * 10000 + c * 1000 + d * 100 + e * 10 + f;
if (check(x, x * x)) {
printf("%lld %lld \n", x, x * x);
}
}
}
}
}
}
}
}
return 0;
}
知识点:
-
c语言中将数字转化为字符串
int 型数 itoa( x,字符串名,进制数)
long型数 ltoa()
long long型数 lltoa() -
str1[i] != ‘\0’
该语句要放在整个for循环中去看
for (int i = 0; str1[i] != ‘\0’; i++)
字符串结尾有一个自带的换行符,str1[i] != '\0’限定i小于换行符检索位的数字。