#include <iostream>
#include <vector>
using namespace std;
void stringToInt(string s,vector<int> &ve)
{
for(int i=0;i<s.size();i++)
{
int k=0;
if(s[i]<='9'&&s[i]>='0')
k=s[i]-'0';
else
{
if(s[i]>='a')k=s[i]-'a'+10;
else if(s[i]>='A')k=s[i]-'A'+10;
}
ve.push_back(k);
}
}
void change(vector<int> ve,vector<int> &result,int m,int n)
{
int i=0;
while(i<ve.size())// 当该数除为0时,即全部为0
{
int r=0;// 每次的余数
for(int j=i;j<ve.size();j++)
{
int t=m*r+ve[j];// 上一位的余数+该位上的数字
int div=t/n;// n进制
ve[j]=div;// 保存该位除法的商
r=t%n;// 该位的余数
}
// 一次除法计算完毕后
result.push_back(r);// 将该次取余值保存
while(ve[i]==0)i++;// 把前置0略去,全部为0时i增加到ve.size()即跳出循环
}
}
void output(vector<int> v)
{
for(int i=v.size()-1;i>=0;i--)
{
if(v[i]>=10)
{
char c=v[i]-10+'A';// 输出为小写
cout<<c;
}else
cout<<v[i];
}
cout<<endl;
}
void func()
{
int m,n;
string s;
while(cin>>m>>s>>n)
{
vector<int> ve;
stringToInt(s,ve);
vector<int> result;
change(ve,result,m,n);
output(result);
}
}
int main(int argc, char *argv[])
{
//printf("Hello, world\n");
func();
return 0;
}
大数除法取余
-
题目描述:
-
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
-
输入:
-
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
数据可能存在包含前导零的情况。
-
输出:
-
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
-
样例输入:
-
15 Aab3 7
-
样例输出:
-
210306
-
提示:
-
可以用字符串表示不同进制的整数。