PAT 1117 数字之王 20分

144 阅读2分钟

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;
}