【Code pratice】——排他平方数

D a t e : 2022 − 10 − 05 \color{FF22CC}{Date:2022-10-05} Date20221005

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个数字的出现次数是否唯一即可,下面记录下怎么判断数字出现的唯一性

  1. 6位数本身都是互不相同的
    通过一个数组,用下标表示数字,对应的值表示该数字出现的次数,如果次数出现2次,即说明该数字不符合第二点要求
int a[10];
while (num)
{
    if (a[num % 10])    // 如果 a[num % 10] == 1,则说明之前该数字已经出现过,这是第二次出现
    {
        break;
    }
    a[num % 10]++;
    num /= 10;
}
  1. 平方后的数字每一位都不是原数字上的任一位数字
    前面使用一个数组记录了原数字的每一位,这里只需要对比平方后的数字的每一位是否在数组中出现过即可
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;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ltd Pikashu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值