正解——高精度算法代码
由于本题的数字过大不能直接按数字处理(int存放不下),因此使用数组按位存储。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6;
int q[N], p[N];
char get(int m)
{
if(m<=9) return m+'0';
else if(m<=35) return m+'A'-10;
else if(m<=61) return m+'a'-36;
}
int reget(char m)
{
if(m<='9') return m-'0'; // '0'=48 'A'=65 'a'=97
else if(m<='Z') return m-'A'+10;
else if(m<='z') return m-'a'+36;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
string s;
cin>>s;
int q[N]={0}, p[N]={0};
//将输入的字符串转化为数组,每一位存放到整数型数组(q[N])
int l=0;
for(auto t:s)
{
q[l++]=reget(t);
}
//结束时l=s.size()
//进行进制转换
int h=0;
int j=0;
while(h<l)
{
int r=0;
for(int i=h;i<l;i++) //循环完一次,即进行了一位进制转换
{
q[i]+=r*a; //前一位的余数*当前进制数+当前位的数字
r=q[i]%b; //求此位的余数
q[i]/=b; //求此位的商,下一次计算作为被除数。
}
p[j++]=r;//将转换后的每一位存入p[N]数组中
while(h<l&&q[h]==0) h++;
//当上面for结束,把开头等于0的无效值去掉。(也即通过除来使位数下降,直到最后一位为0停止)
}
cout<<a<<" "<<s<<endl;
cout<<b<<" ";
for(int i=j-1;i>=0;i--)
{
cout<<get(p[i]);
}
cout<<"\n"<<"\n";
}
}
比较容易理解的
这个解法用于数字较小时
int的大小:
—— 在win32下,int的范围是 -2^31 ~ 2^31 - 1;
—— 也就是:[ -2147483648, 2147483647];
—— 即$ 10^{10} $ 以内,不过更常用的是$10^9$
#include<iostream>
#include<algorithm>
using namespace std;
char get(int m)
{
if(m<=9) return m+'0';
else if(m<=35) return m+'A'-10;
else if(m<=61) return m+'a'-36;
}
int reget(char m)
{
if(m<='9') return m-'0'; // '0'=48 'A'=65 'a'=97
else if(m<='Z') return m-'A'+10;
else if(m<='z') return m-'a'+36;
}
string base(string s,int a,int b)
{
int res=0;
string n;
for (auto t:s)
{
res=res*a+reget(t);
}
while(res)
{
n+=get(res%b);
res/=b;
}
reverse(n.begin(),n.end());
return n;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int x,y;
cin>>x>>y;
string s;
cin>>s;
cout<<x<<" "<<s<<endl;
cout<<y<<" "<<base(s,x,y)<<endl<<endl;
}
}