概述
3的一万亿次方的第九位数。
这题其实非常简单,直接快速幂取模就好了。
介绍一下位运算,>>右移一位 <<左移一位 &按位与 |按位或 这个东西和计算机在内部存储数据有关,用codeblocks单步调试的话是可以看的,就是你把一个东西写成二进制形式然后运算,比如右移其实就是除二左移就是乘2,&就是判断运算符两边二进制情况下最右边的值是不是都是1,或也同理,书上有可以去慢慢看,挺简单的
#include<bitsstdc++.h>
using namespace std;
long long int MI(long long int a,long long int b)
{
long long int ans=1,base=a;
while(b!=0)
{
if(b&1!=0)
ans=ans*base%1000000000;
base=base*base%1000000000;
b>>=1;
}
return ans;
}
int main()
{
printf("%lldn",MI(3,1000000000000));
}
快速幂是我一开始的代码,其实这个代码思路是对的,在64位机sublime里运行是没错的。
之后李老师提供了另两种思路就是用欧拉函数化简原式子第二个思路是10次方的十次方的十次方这么算
欧拉函数,对10的九次方取模,化简之后可以得到,前九位循环节在2的10次方和5的8次方这个地方
#include<bitsstdc++.h>
using namespace std;
long long int MI(long long int a,long long int b)
{
long long int ans=1,base=a;
while(b!=0)
{
if(b&1!=0)
ans=ans*base%1000000000;
base=base*base%1000000000;
b>>=1;
}
return ans;
}
int main()
{
printf("%lldn",MI(3,pow(2,10)+pow(5,8)));
}
算出来也是1,则第九位是0;
答案一样
但是很尴尬,这两种方法我都用不了,我的电脑在之前是不支持longlong的,
所以我就手动了大数,建数组模拟乘法
可是算起来可能是一开始数组开的太大了。
有些慢,就用了FFt优化,怎么说呢,我学了一个下午,加上今天下午有学霸指导,我才会了一点点
最后
以上就是大胆大船为你收集整理的李晓东老师的新手入门题题解的全部内容,希望文章能够帮你解决李晓东老师的新手入门题题解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复