2020暑期牛客多校训练营第九场(A)Groundhog and 2-Power Representation(高精度)

Groundhog and 2-Power Representation

原题请看这里

题目描述:

土拨鼠参加了数学课。 在这堂课上,他的数学老师说:
任何正整数都可以用 2 {2} 的幂表示。
例如: 137 = 2 7 + 2 3 + 2 0 137 = 2 ^ 7 + 2 ^ 3 + 2 ^ 0
幂用括号表示。即, a ( b ) {a(b)} 代表 a b {a ^ b} 。因此, 137 {137} 可以表示为 137 = 2 ( 7 ) + 2 ( 3 ) + 2 ( 0 ) 137 = {2(7)+2(3)+2(0) }
此外,对于 7 = 2 2 + 2 + 2 0 7 = 2 ^ 2 + 2 + 2 ^ 0 ( 2 1 2 ^ 1 2 {2} 表示), 3 = 2 + 2 0 3 = 2 + 2 ^ 0
,137可以最终表示为 137 = 2 ( 2 ( 2 ) + 2 + 2 ( 0 ) ) + 2 ( 2 + 2 ( 0 ) ) + 2 ( 0 ) {137 = 2(2(2)+ 2 + 2(0))+ 2(2 + 2(0))+ 2(0)}
另一个示例: 1315 = 2 10 + 2 8 + 2 5 + 2 + 1 = 2 ( 2 ( 2 + 2 ( 0 ) ) + 2 ) + 2 ( 2 ( 2 + 2 ( 0 ) ) ) + 2 ( 2 ( 2 ) + 2 ( 0 ) ) + 2 + 2 ( 0 ) 1315 = 2 ^ {10} + 2 ^ 8 + 2 ^ 5 + 2 + 1 = 2(2(2 + 2(0))+ 2)+2(2(2 + 2(0))) +2(2(2)+2(0))+ 2 + 2(0)
土拨鼠感觉很棒,希望您编写一个模拟上述内容的程序。您需要读入 2 {2} 的幂的表达式并计算其值。

输入描述:

一行,表示一个2的幂的表达式。

输出描述:

输出表达式的值。

样例输入:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

样例输出:

1315

思路:

高精度
首先我们判断一下如果有"2("出现,那么我们就开始递归,否则直接答案+2
设有一个数h
每次进来一个括号就判断一下一下是左括号还是右括号,如果是左括号就h++,右括号就h–,如果h==0,说明这个括号内已经算完了。
应为最大的一个括号内的数比较小,所以我们可以直接算指数。
具体细节请看代码。

A C AC C o d e Code

(队友写的,有不对的地方请指出)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
char a[20010];
ll sum;
int ans[205],anslen;
void gaojin(int b[],int len){
	anslen=max(anslen,len);
	for(int i=1;i<=anslen;++i){
		ans[i]+=b[i];
		ans[i+1]+=ans[i]/10;
		ans[i]%=10;
	}
	while(ans[anslen+1]) ++anslen;
}//高精加法
int b[1005];
void ksm(ll c){
	memset(b,0,sizeof(b));
	b[1]=1;
	int k=1;
	for(int i=1;i<=c;++i){
		int x=0;
		for(int j=1;j<=k;++j){
			b[j]=b[j]*2+x;
			x=b[j]/10;
			b[j]%=10;
			if(x&&j==k) ++k;
		}
	}
	gaojin(b,k);
}//2的幂次高精
ll ksm1(ll b,ll c) {
    ll d=1;
    while(c>0) {
        if(c&1)d*=b;
        c>>=1;
		b*=b;
    }
    return d;
}//2的幂次
int p,k;
ll dg(ll x,ll h){
	ll q=0;p=0;
	for(int i=x;i<k;i++){
		p=max(p,i);
		if(a[i]=='(')h++;
		if(a[i]==')')h--;
		if(!h){ksm(q);return 0;}
		if(a[i]==')'){return ksm1(2,q);}
	    if(a[i]=='2'){
			if(a[i+1]=='(') q+=dg(i+1,h),i=p;
			else q+=2;
		}
	}
}
int main(){
	scanf("%s",a);
	k=strlen(a);
	for(int i=0;i<k;i++)
		if(a[i]=='2'){
			if(a[i+1]!='('){
				memset(b,0,sizeof(b));
				b[1]=2;
				gaojin(b,1);
			}
			else dg(i+1,0),i=p;
		}
	for(int i=anslen;i>=1;i--)
		printf("%d",ans[i]);
}

猜你喜欢

转载自blog.csdn.net/s260127ljy/article/details/107883933