D a t e : 2022 − 10 − 05 \color{FF22CC}{Date:2022-10-05} Date:2022−10−05
T h e \color{FF22CC}{The} The s e c o n d \color{FF22CC}{second} second d a y \color{FF22CC}{day} day w a k e \color{FF22CC}{wake} wake u p \color{FF22CC}{up} up m e \color{FF22CC}{me} me n o t \color{FF22CC}{not} not a l a r m \color{FF22CC}{alarm} alarm c l o c k , \color{FF22CC}{clock,} clock, i n f a c t , \color{FF22CC}{in fact,} infact, i s \color{FF22CC}{is} is d r e a m ! \color{FF22CC}{dream!} dream!
🌭1. 排它平方数🌭
🍟题目🍟
具有这样两个神奇的六位数,它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字
🍟思路🍟
根据题目,可以得出三个关键点:1. 这两个数字是6位数;2. 这两个数字的每一位都不相同;3. 这两个数的平方数的每一个数位都不包含原数字的任一个数字
透过这三点也就得出了基本的思路,先判断是不是六位数,再判断当前数字上是否有相同的数字的位,最后再对比平方后的数字是否出现了原数字上的任一一位
最后简化理解就是判断0~9这10个数字的出现次数是否唯一即可,下面记录下怎么判断数字出现的唯一性
- 6位数本身都是互不相同的
通过一个数组,用下标表示数字,对应的值表示该数字出现的次数,如果次数出现2次,即说明该数字不符合第二点要求
int a[10];
while (num)
{
if (a[num % 10]) // 如果 a[num % 10] == 1,则说明之前该数字已经出现过,这是第二次出现
{
break;
}
a[num % 10]++;
num /= 10;
}
- 平方后的数字每一位都不是原数字上的任一位数字
前面使用一个数组记录了原数字的每一位,这里只需要对比平方后的数字的每一位是否在数组中出现过即可
while (square)
{
// 如果 a[square % 10] == 1,则说明之前该数字出现过,不符合要求
if (a[square % 10])
{
break;
}
sauare /= 10;
}
🍟代码🍟
void ExclusiveSquare()
{
vector<int> res(2, 0);
int resNum = 0;
for (long long i = 123456; i <= 987654; i++)
{
vector<int> OriNum(10, 0);
bool bValid6 = true;
bool bValidSqu = true;
int tmp = i;
while (tmp)
{
if (OriNum[tmp % 10])
{
bValid6 = false;
break;
}
OriNum[tmp % 10]++;
tmp /= 10;
}
if (!bValid6)
{
continue;
}
long long uSqu = i * i;
while (uSqu)
{
if (1 == OriNum[uSqu % 10])
{
bValidSqu = false;
break;
}
uSqu /= 10;
}
if (!bValidSqu)
{
continue;
}
res[resNum++] = i;
}
cout << "The only two exclusive squares are [" << res[0] << ", " << res[1] << "]" << endl;
}