题目链接:http://noi.openjudge.cn/ch0204/2991/
描述已知长度最大为200位的正整数n,请求出2011^n的后四位。输入第一行为一个正整数k,代表有k组数据,k<=200接下来的k行,每行都有一个正整数n,n的位数<=200输出每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0样例输入
3 5 28 792样例输出
1051 81 5521
这道题其实很简单,就是用快速幂的方法,只不过数有点大,爆int,爆ll,因此我们用字符串来模拟数字的输入,和大数的加减法类似,只不过换了一种运算方法,但本质是差不多的。。有点水。。
至于快速幂的算法的介绍在我的另一个博客中,链接:
http://blog.csdn.net/qq_40482358/article/details/79323636
知道快速幂之后这道题就变成水题了。。。:
ac:
#include<stdio.h>
#include<string.h>
#include<math.h>
//#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define da 0x3f3f3f3f
#define xiao -0x3f3f3f3f
#define clean(a,b) memset(a,b,sizeof(a))// 雷打不动的头文件
int main()
{
int t;
cin>>t; //t组样例
while(t--)
{
int shuzu[250]; //每一位用数组储存方便一点
clean(shuzu,0); //注意清空元素
string chuan; //先用字符串储存每一位
cin>>chuan; //输入
int i,j,l=chuan.size(); //l:取长
for(i=0;i<l;++i)
shuzu[i]=chuan[i]-'0'; //吧字符串中的元素转化成数字存到数组中
int f=1,ji=1,can=2011; //底数是2011;
for(i=0;i<l;++i) //首先判断输入的数字是不是0
{
if(shuzu[i]!=0)
break; //不是0就快速幂
else if(i==l-1&&shuzu[i]==0)//是0就直接输出1
f=0;
}
while(f) //快速幂算法
{
if(shuzu[l-1]&1) //个位数的判断
ji=ji*can%10000; //是则乘上取模
can=can*can%10000; //底数平方
for(i=0;i<l;++i) //模拟除2(右偏运算符)
{
int temp; //temp是中间变量
temp=shuzu[i]%2; //用来给下一个数凑余数
shuzu[i]=shuzu[i]/2; //这个数除2
shuzu[i+1]=shuzu[i+1]+temp*10;//下一位加上这个数的余数
}
for(i=0;i<l;++i) //判断现在的幂是不是0
{
if(shuzu[i]!=0)
break;
else if(i==l-1&&shuzu[i]==0)
f=0;
} //如果不是0就继续,如果是0就结束循环
}
cout<<ji%10000<<endl; //输出答案对10000取模四位数;
}
}
是不是很水??没有新东西,全是老的,观众老爷们点个赞再走吧。。。