目标:现在要从进制Q转换为进制T,2<=Q,T<=10
思想:将Q进制的数转换为十进制,再从十进制转换为T进制
输入格式:
第一行输入一个整数Q, 代表Q进制(2<=Q<=10)
第二行输入以回车结束的一行非空字符串。
第三行输入一个整数T, 代表要转换成T进制
输出格式:
输出转换后的T进制数字符串。
#include <iostream>
#include <string>
using namespace std;
int main()
{
int Q,T;
long long int sum=0,len;
string s;
ios::sync_with_stdio(false); //C++加速
cin.tie(0); //C++加速
cin>>Q;
cin.ignore();//丢掉回车
getline(cin,s);
cin>>T;
len=s.length();
string out="";
for(int i=0;i<len;i++)
if( s[i]>='0'&&s[i]-'0'<Q)//此处经验证,必须得大于等于'0',估计应该是出现了比0小的
out+=s[i]; //sum=sum*Q+s[i]-'0';此为转换十进制的另一种方式
long long int base=1;//位权
for(int i=out.length()-1;i>-1;i--)//从右往左加
{
sum=sum+(out[i]-'0')*base;
base*=Q; //位权
}
if(!sum) //0不需要转换
{
cout<<'0'<<endl;
return 0;
}
if(T==10) //十进制直接输出
{
cout<<sum<<endl;
return 0;
}
int t[100000],j=0;
while(sum)
{
t[j++]=sum%T; //十进制转换为T进制,都是对T进行短除法,而这个过程其实就是取余
sum/=T;
}
for(j--;j>=0;j--)
cout<<t[j];
cout<<endl;
return 0;
}
注意:1.最好不要使用pow函数,pow函数作为一个double型函数,在进行计算时,很有可能会出现类似pow(10,2)=99的问题(依赖于编译器),导致精度的损失。
2.经验证,输入不可写成cin>>Q>>s>>T,因为若字符串中存在空格,cin的特性会影响到T的值,进而影响结果.
3.读入数据时,可以采用更高效的一种手段,链接请点击
4.Q进制转换为十进制,另外我所知道的一种方式,即上面代码提到的,
原理大概为短除法的反向。