题目
203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
6位正整数
每个数位上的数字不同
其平方数的每个数位不含原数字的任何组成数位
以下程序实现了这一功能,请你补全以下空白处内容:
#include <iostream>
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<iostream>
using namespace std;
#include<string>
void 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
请按任意键继续. . .