1076 K尾相等数

时间限制:500MS  内存限制:65536K
提交次数:251 通过次数:80

题型: 编程题   语言: C++;C

 

Description

从键盘输入一个自然数K(99999999>K>1),若存在自然数M和N(M>N),使得K的M次方和K的N次方均大于或等于1000,
且它们的未尾三位数相等,则称M和N是一对“K尾相等数”。请编程序,输出K尾相等数中M+N最小值。




 

输入样例

2



 

输出样例

120
#include<cstdio>
#include<cstring>
int powermod(int a,int b)
{
    int ans=1;
    a=a%1000;
    if(!a) return 0;
    while(b)
    {
        if(b%2==1)
            ans=ans*a%1000;
        a=a*a%1000;
        b/=2;
    }
    return ans;

}
int main()
{
    int res;
    int i,j=0,t,k,p;
    int a[1005];
    int leap=0;
    scanf("%d",&k);
    //下面的if else 语句,当k为对应值时,恰好其p次方超过一千
    if(k==2) p=10;
    else if(k==3) p=7;
    else if(k==4||k==5) p=5;
    else if(k==6||k==7||k==8||k==9||k==10)
        p=4;
    else if(k>=11&&k<=31) p=3;
    else if(k>=32&&k<=999) p=2;
    else p=1;
    
    for(i=p; i<=1001; i++)
    {
        res=powermod(k,i);
        a[j++]=res;
        //下面for循环用于判断之前有没有出现和这次求得的a[j-1]相同的值
        for(t=0; t<j-1; t++)
            if(a[j-1]==a[t])
            {

                leap=1;
                break;
            }
        if(leap) break;

    }
    //数组的下标从0开始,而代表幂的循环从p开始
    printf("%d
",(j-1+p)+(t+p));
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/orchidzjl/p/4283403.html