题目描述
给出一个36进制的大数A(0-9,A-Z),将其转为10进制并输出。
每一位用’0-9”,’A-Z’来表示,A的长度 <= 100000)
a进制数k转b进制问题
第一位(最低位)=k%b
第二位=k/b%b
第三位=k/b^2%b
……
(这个应该是比较显然的)
然而A的长度 <= 100000,太大了,直接做会超时啊。
这种时候,我们需要压位,而且只压其中一个数是不行的,两个数要一起压(详见代码)
代码
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define ll unsigned long long
using namespace std;
const int ma=100000*160;const int maxn=100000+5;
int i;
ll r[ma/17+1];
ll c[maxn],ten[19],a3[11];
char s[maxn];
int get(char c) {
if(c>='0'&&c<='9') return c-'0';
return c-'A'+10;
}
void change(){
int i,t=0;
c[0]=strlen(s+1);
fo(i,1,c[0]) {
if ((i-1)%4==0) t++;
c[t]=c[t]*36+get(s[i]);
}
c[0]=t;
}
void solve(){
ll y;int i,j=1;bool b;
while(j<=c[0]){
y=b=0,i=j;
while(i<=c[0]){
y=y*a3[4]+c[i];c[i++]=0;
if (y>=ten[13])c[i-1]=y/ten[13],y%=ten[13];
if (c[i-1]) b=1;if (!b) j=i;
}
r[++r[0]]=y;
}
}
void output() {
int i;
printf("%lld",r[r[0]]);
fod(i,r[0]-1,1){
ll x=r[i],t=1;
while (x<ten[13-t]) printf("0"),t++;
printf("%lld",r[i]);
}
printf("\n");
}
int main(){
a3[0]=ten[0]=1;
fo(i,1,17) ten[i]=ten[i-1]*10;
fo(i,1,10) a3[i]=a3[i-1]*36;
scanf("%s",s+1);
change();
solve();
output();
}