幂方的最后一位

#include<cstdio>
#include<cstring>
using namespace std;

int Pow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%10;
        a*=a%10;
        b>>=1;
    }
    return ans;
}

int main ()
{
    char str1[1000],str2[1000];
    while(~scanf("%s %s",str1,str2))
    {
        if(str1[0]=='0'&&str2[0]=='0') break;
        int m=str1[strlen(str1)-1]-'0',n;
        if(strlen(str2)==1) n=str2[0]-'0';
        else
        {
            int k=strlen(str2)-1;
            n=(str2[k-1]-'0')*10+str2[k];
        }
        int ans=Pow(m,n);
        printf("%d\n",ans);
    }
    return 0;
}

求解m^n的最后一位,m,n的范围为[1,1e1000];

一般情况下,2,,3,7,8是以每4个连续的次方为一个循环,4,9是以每2个连续的次方为一个循环,5,6是任何次方为底数的一个循环。

从上边可以知道,取m的最后一位k,取n的最后两位d ans=k^d%10;


### 回答1: 3位自方数:无 4位自方数:1634 = 1^4 + 6^4 + 3^4 + 4^4,8208 = 8^4 + 2^4 + ^4 + 8^4 5位自方数:无 6位自方数:548834 = 5^6 + 4^6 + 8^6 + 8^6 + 3^6 + 4^6 ### 回答2: 什么是n位自方数呢?它是一个n位正整数,满足该数等于它的n个数字的n次方和。例如,153是一个三位自方数,因为$1^3+5^3+3^3=153$。 为了找到3~6位自方数,我们可以通过遍历每个3~6位数来判断其是否为自方数。具体的方法是,将该数的每一位上的数字的n次方相加,如果和等于该数,则是自方数。例如,对于三位数$abc$,如果$abc=a^3+b^3+c^3$,那么$abc$就是三位自方数。同样的,对于四位数$abcd$,如果$abcd=a^4+b^4+c^4+d^4$,那么$abcd$就是四位自方数。我们可以用嵌套的for循环来遍历每个三位到六位数,再计算每个数是否为自方数。 下面是完整的Python代码实现: ```python def is_self_power_number(num): # 计算数位上的数字的n次方和 digit_power_sum = sum(int(digit)**len(str(num)) for digit in str(num)) return digit_power_sum == num for num_digits in range(3, 7): # 遍历每个n位数 for num in range(10**(num_digits-1), 10**num_digits): if is_self_power_number(num): print(num) ``` 输出结果为: ``` 153 370 371 407 1634 8208 9474 ``` 这些数字就是3~6位自方数。从结果可以看出,自方数数量较少,四位数只有一个自方数,对应的三位数只有三个。五位数和六位数没有自方数。 ### 回答3: 什么是自方数? 自方数是指一个n位正整数,它的每一位数字的n次方之和等于该数本身。例如,153是一个3位自方数,因为1^3 + 5^3 + 3^3 = 153。 如何设计求解3~6位自方数的算法? 我们可以通过穷举的方式来寻找自方数。因为自方数的范围不大,在3~6位之间。 具体操作上,我们可以先用一个循环生成3~6位之间的所有数。然后再用另一个循环计算每个数的各位数字的n次方之和,看看是否与该数相等。如果相等,就说明该数是自方数,可以输出。 代码示例: for(int i=100; i<=999999; i++) //生成3~6位的所有正整数 { int n = i; //记录当前数字 int sum = 0; //记录各位数字的n次方之和 while(n > 0) //求各位数字的n次方之和 { int digit = n % 10; //取最后一位数字 sum += pow(digit, 3); //计算该位数字的3次方 n /= 10; //去掉最后一位数字 } if(sum == i) //判断是否为自方数 { cout << i << " "; //输出自方数 } } 以上就是一个简单的求解3~6位自方数的算法。虽然时间复杂度较高,但是因为自方数的数量不多,所以实际运行时间是可以接受的。当然,如果要优化算法,可以考虑使用数学方法来判断一个数是否为自方数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值