PATB级-1091 N-自守数 (15 分)

 题目链接

解题思路

构造一个判断自守数的函数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;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值