完全平方数问题

文章描述了一种编程问题,要求使用0至9这10个数字各一次,组成一位数、两位数、三位数和四位数的完全平方数。通过枚举和数位拆分的方法,检查所有可能的组合,找到满足条件的方案数量。代码示例中展示了如何实现这个算法。
摘要由CSDN通过智能技术生成

说明

用0至9这10个数字组成一位数、两位数、三位数、四位数各一个,使它们都是非零的完全平方数.例如1,36,784,9025就是满足条件的一种分法

输出格式

输出有多少种方案

题解

我们可以自己造出完全平方数,怎么造呢?例如3,用它自己乘它自己,就是9,就造出来一个完全平方数了(优势:可以省时间复杂度)。

然后我们就可以分类讨论四种情况:

step 1:一位数

一位数的范围是0~9,注意题目说“它们都是非零的完全平方数”,所以我们枚举时就只要枚举1~3就行了(0*0=0)。

step 2:两位数

两位数的范围是10~99,只要枚举4~就行了。

step 3:三位数

三位数的范围是100~999,只要枚举10~就行。

step 4:四位数

四位数的范围是1000~9999,只要枚举10~

枚举完之后,我们依次将这四个数乘它自己,就得到四个完全平方数,将四个完全平方数数位拆分后判断是不是都是0~9这几个不重复的数字组成的,如果是,就cnt++。

代码

#include<bits/stdc++.h>
using namespace std;
int cnt;
int b[10];
void f(int x)     //数位拆分函数
{
    while(x>0)
    {
        b[x%10]++;
        x/=10;
    }
}
int main()
{
    for(int i=1;i<=3;i++)
    {
        for(int j=4;j<=sqrt(99);j++)
        {
            for(int k=10;k<=sqrt(999);k++)
            {
                for(int l=32;l<=sqrt(9999);l++)
                {
                    int a=i*i,b1=j*j,c=k*k,d=l*l;
                    memset(b,0,sizeof(b));
                    f(a);f(b1);f(c);f(d);
                    bool cmp=1;
                    for(int o=0;o<=9;o++)
                    {
                        if(b[o]==0)     //因为一位数,两位数,三位数,四位数总共十位,所以只要有数字重复那么另一个数字就会没有,比如1,24,456,7890,4重复了,就导致3没有
                        {
                            cmp=0;
                            break;
                        }
                    }
                    if(cmp)cnt++;
                }
            }
        }
    }
    cout<<cnt;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值