203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
6位正整数
每个数位上的数字不同
其平方数的每个数位不含原数字的任何组成数位
以下程序实现了这一功能,请你补全以下空白处内容:
#include
using namespace std;int main()
{int num[10], flag;for (long long i = 123456; i <= 987654; i++){long long a = i;long long b = i * i;memset(num, 0, sizeof(num));flag = 1;while (a){_________________;}if (flag){while (b){if (num[b % 10]){flag = 0;break;}b /= 10;}if (flag)cout << i << endl;}}return 0;
}
提示:
0的平方为0
1的平方为1
5的平方为5
6的平方为6
以上这4个数字都不能作为原数字的最后一位,可以在最后一位排除
且第一位不能为0
if (num[a % 10])
{flag = 0;break;
}
num[a % 10]++;
a /= 10;
1.6位正整数;
2.每个数位上的数字不同;
3.其平方数的每个数位不含原数字的任何组成数位;
4.int占4字节内存,long long占8字节,六位数的平方int型变量可能存不下,因此需要用long long;
5.如何进行判断,memset(arr , val , sizeof(arr));来对数组进行初始化。memset函数用法
#include
using namespace std;
#includevoid func()
{int num[10];for (long long i = 123456; i <= 987654; i++){long long a = i;long long b = i * i;memset(num, 0, sizeof(num)); //对数组进行初始化,赋值。num = {0,0,0,0,0,0,0,0,0,0}int Flag = 1;while (a){if (num[a % 10]){Flag = 0;break;}num[a % 10]++;a /= 10;}if (Flag){while (b){if (num[b % 10]){Flag = 0;break;}b /= 10;}if (Flag){cout << i << "\t" << i * i << endl;}}}
}int main()
{func();system("pause");return 0;
}
203879 41566646641
639172 408540845584
请按任意键继续. . .