大数的快速幂(模拟水题。)

题目链接: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取模四位数; 
	}
}

是不是很水??没有新东西,全是老的,观众老爷们点个赞再走吧可怜可怜可怜。。。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值