2011

本文深入探讨了一种结合高精度运算的快速幂算法,针对n位数高达两百位的大整数运算场景,通过数组存储大整数并实现除2操作,辅以快速幂算法,有效解决大整数指数运算难题。

题目点这里

本题是一道快速幂的题目,但不同于一般的快速幂,此快速幂需要结合到高精度,因为题干条件里写了n的位数最高有两百位,可见不开高精度的话肯定是过不了的。
所以用一个数组来保存n,再编写一个子程序用于对n进行除2的操作,再加以一个快速幂。
代码如下

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n[300];
/*void bc(){
	cin>>b;
	int a=2011;
	while(b>0){
		if(b%2==1) ans=ans*a%c;
		b/=2;
		a=a*a%c;
	}
	cout<<ans<<endl;
} */
void chu2(){
	 int y=0;
	 bool flag=false;
	 n[1]-=n[1]%2;
	 for(int i=n[0];i>=1;i--){
	 	 if(n[i]%2==1){
	 	 	flag=true;
	 	 	n[i]-=1;
	 	 } else flag=false;
	 	 n[i]=n[i]/2+y;
	 	 if(flag) y=5; else y=0;
	 }
	 if(n[n[0]]==0) n[0]--;
}
void quickm(int a,int ans){
	if(n[0]<=0) cout<<ans<<endl;
	else{
	if(n[1]%2==0) {chu2();quickm(a*a%10000,ans);}
	else {chu2();quickm(a*a%10000,ans*a%10000);}}
	return;
}
int main(){
	string s;
	int t;
	cin>>t;
	while(t--){
	memset(n,0,sizeof(n));
	cin>>s;
	n[0]=s.length();
	for(int i=1;i<=n[0];i++){
		n[i]=s[n[0]-i]-'0';
	}
	quickm(2011,1);
    }
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值