K尾相等数问题


描述

一个自然数K(2≤K),若存在自然数M和N(M大于N),使得K^M和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对“K尾相等数”。

输入

输入包含若干个测试用例,每个测试用例占一行,为一个自然数K。

输出

对每个测试用例,用一行输出符合要求的最小M+N值。

样例输入

2

样例输出

120
//   在每隔1000后总有3位数相同的数  例如 1234    2234 后面的3位数字相同 “234”
#include <iostream>
using namespace std;
#define  len  1000 
int  a[1001];
int main()
{
 
	int m,s,k,flag;
	while(cin>>k)
	{
		s=1;flag=0;  //s用来存储2^n 和2^m
		memset(a,0,sizeof(a));
		if(k>=len)      //如果k>1000就取出后3位
		{
			k%=len;
			flag=1;  //标记一下
		}
		m=1;
		while(1)
		{
			s*=k;   
			if(s>=len || flag==1)  //当s>1000就进入循还
			{
				if(a[s%len]==0)   //将没有出现的项标记
					a[s%len]=m;    //找到第一个满足m
				else 
				{ 
					a[s%len]+=m;  //  如果下次在此处就是要找的n 退出循环
					break;          
				}
				flag=1;
			}
			if(s>=len)
				s=s%len;   //如果s>len  将s的范围 0--999;
			m++;     //用来找出 n m
		}
		cout<<a[s%len]<<endl;
	}
	return 0;
}



在网上找到以下测试数据:

测试数据:

25

125

1000

1234

111111

1000003

123454321

测试数据结果:

7

6

3

56

52

102

27 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值