说明
用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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/24a5983d89044f86d458364f4a82ee25.png)