1061—Rightmost Digit

本文介绍了一种利用二进制快速幂法解决大数指数运算的方法,通过不断将底数平方并取模来减少计算量,适用于底数较大情况下的高效计算。文章还分享了关于取模运算的一些技巧。

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

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1061

收获:1.利用二进制求指数幂(快速幂法)~~减少循环次数和提高速度(适用于乘数比较大的情况下)

2.(a*b)%n=(a%n*b%n)%n;

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>



int main()
{int t;
__int64 n;
scanf("%d",&t);
while(t--)
{scanf("%I64d",&n);

int k;
k=n%10;

int t=1;
while(n) //n为指数,n同时也为底数,k也相当于底数
{if(n&1){  //判断该位是否是1,如果为1,首次赋值给t,后来的与t相乘,求10的余数,再赋值给t
t*=k;
t%=10;
}

k*=k;
k%=10;  //因为每当n向左移一位时,相当于2^n个k相乘(2^0表示1个,2^1表示2个2^0,2^2表示2个2^1……以此类推)
n>>=1;  //n化为二进制数,不断左移~~
}
printf("%d\n",t);

}
return 0;
}

注意:k,t的范围,容易超出~~因为不断乘,很可能会变成大数~~

 


 知识点扩展:http://blog.163.com/xiaoting_hu/blog/static/50464772201325095143/(转载)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值