2.1K尾相等数

本文探讨了一个数学问题,即找到一个大于1的自然数K,当K的幂次M和N(M>N)均大于或等于1000时,且它们的末尾三位数相等时,输出M+N的最小值。通过构造数组记录末尾三位数,利用循环和条件判断,最终得到结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 *从键盘输入一个自然数K(K > 1),若存在自然数M和N(M > N),使得K^M和K^N均大于或等于
 *1000,且它们的末尾三位数相等,则称M 和 N是一对“K尾相等数”。请编一程序,输出M+N
 *值最小的K尾相等数。
 *对于一个数,它的幂是无穷无尽的,但是可以注意到末尾三位数只有1000个,也就是表明一定
 *会有重复的末尾三位数,当一个数的末尾三位数一定时,它的下一次幂的末尾三位数也一定了。
 *也就是表明当第一次重复出现大于等于1000的末尾三位数时,这就是我们要求的M和N。

 /

1.如果不考虑空间因素,构造1000数组,将每个i次数的i存入以它的尾数最后三位数x的n[x]中,如果发现n[x]已经存入,就可以将i与n[x]相加,得出结果。

2.因为只考虑尾数即可,为了防止溢出,可以将阶乘num 等效看成(1000+尾数)

#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
    double num = 0;
    int n[1000]={0};
    int i=1,m=0;
	int myn=0;
	while(1)
	{
		cin>>num;
		myn=num;
		if(num>10000)
			num=1000+myn%1000;
		for(i=0;i<1000;i++)
			n[i]=0;
		i=1;
		m=0;
		if(myn==1)
			break;
		while(myn<1000) // n>=1000
		{
			i++;
			myn=myn*num;
		}
		myn=myn%1000;
		n[myn]=i;
		i++;
		myn=myn*num;
		myn=myn%1000;
		while(n[myn]==0)
		{
			n[myn]=i;
			i++;
			myn=myn*num;
			myn=myn%1000;
		}
		m = n[myn]+i;
		cout<<m<<endl;
	}
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值