1117 数字之王 - PAT (Basic Level) Practice (中文) (pintia.cn)
解析:
首先需要明白题意,第一轮:{ 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };
现在我们对每一个数字的每一位进行立方乘,变为:
{1,512,729,1000,512,729,1000,512,512,0}。ps:18不是直接求pow(18,3)而是求pow(1,3)*pow(8,3)
然后我们再把每一个数的每一位进行相加:(比如512就是5+1+2=8)
得到:{ 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };
此时不是所有的数都是个位数,继续进行每一位相乘:得到:
{1,512,512,0,512,512,0,512,512,0};
再对每一个数的每一位进行相加求和,得到: {1,8,8,0,8,8,0,8,8,0};
至此,结束。 数字之王就是8.
搞明白了题意我们就可以进行写了:
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
vector<int>v;
bool isone(vector<int>v)
{
for(int i=0;i<v.size();i++)
{
if(v[i]>=10)return false;
}
return true;
}
int main()
{
int N1,N2,max=0,haxi[10]={0};
vector<int> v, ans; //v用于存放输入的数,ans用于存放数字之王
cin>>N1>>N2;
for(int i=N1;i<=N2;i++)
v.push_back(i);
while(!isone(v)) //如果不是个位数就进行如下操作
{
for(int i=0;i<v.size();i++)
{
if(v[i]==0)continue; //对0进行特判 因为0乘任何数都是0,会导致前功尽弃
int temp=1,sum=0;
while(v[i]) //求各位数的立方乘积
{
temp*=pow(v[i]%10,3); //比如18不是求18立方而是求1的立方 * 比如18不是求18立方而是求1的立方
v[i]/=10;
}
while(temp) //求各位数的相加和
{
sum+=temp%10;
temp/=10;
}
v[i]=sum; //继续进行下一轮直到v[i]变为个位数为止
}
}
//接下来我们统计一下v里面每个数出现的次数,出现的最多的数的次数我们赋值给max,max就是数字之王出现的次数
for(int i=0;i<v.size();i++)
haxi[v[i]]++; //统计出现的次数
for(int i=0;i<10;i++) //赋值给max
if(haxi[i]>max)max=haxi[i];
for(int i=0;i<10;i++) //把数字之王加入到ans里面
if(max==haxi[i])ans.push_back(i); //i是数字指纹
cout<<max<<endl;
for(int i=0;i<ans.size();i++)
{
if(i)cout<<" "<<ans[i]; //如果i不为0就输出 空格 ans[i]
else cout<<ans[i]; //否则就不输出空格
}
return 0;
}