解题思路
构造一个判断自守数的函数isZS(int k, int nkk)
如果k==n*k*k,则k是自守数。
如果k!=n*k*k,分别用10,100,1000,。。。对n*k*k取模,求出末尾1,2,3...位,如果等于k,则k是自首数字
我的代码
#include <iostream>
#include<algorithm>
#include<string>
using namespace std;
bool isZS(int k, int nkk)//判断k是不是自守数字
{
int mod=10;//取模,先mod=10, nkk % 10得到末尾1位数,然后mod=100,nkk % 100得到末尾2位数字
if(nkk == k)//n*k*k==k,则n*k*k结果的末尾几位数等于 K
{
return true;
}
for(int i=0 ; i<to_string(k).length() ;i++)
{
if(nkk % mod==k)//对n*k*k取模,如果n*k*k结果的末尾几位数等于 K
{
return true;
}
mod=mod*10;//mod从10,变成 100,1000,1000,...
}
return false;
}
int main(int argc, char** argv)
{
int m;//M个正整数
int k=0;
cin>>m;
for(int i=0; i<m ;i++)
{
cin>>k;//输入某个数字k
int flag=0;//用来标记是否已经找到并输出了最小的 N 和 n*k*k 的值
for(int n=0 ; n<10 ; n++)//n从[0,9]逐个尝试
{
if( isZS( k , n*k*k ) )//如果k是自守数
{
cout<<n<<' '<< n*k*k <<endl;//输出n,和n*k*k
flag=1;//标记已经输出了最小的 N 和 n*k*k 的值
break;//已经找到了,跳出循环,不必在找n
}
}
if(flag==0)//没有找到适合的n和n*k*k,输出No
{
cout<<"No"<<endl;
}
}
}