将N进制转化为M进制可以分为两步:
1. N->10:直接位权展开即可 eg: 10110 (2) =1*pow(2,4)+.......+0*pow(2,0);
2.10->M:这里辗转相除 取余数 逆序输出即可;
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
char s[10000];
int x[10000];
int n,m,i,p=0,sum=0;
/*原进制,改换进制,计数,~ ,10进制结果*/
cout<<"请输入数字";
cin>>s;
cout<<"请输入原进制";
cin>>n;
cout<<"请输入改换进制";
cin>>m;
strupr(s);
/*以防输入小写不识别*/
for(i=0;i<strlen(s);i++)
{
if(s[i]>'9')
{
x[i]=s[i]-'A'+10;
}
else
{
x[i]=s[i]-'0';
}
sum+=x[i]*pow(n,strlen(s)-1-i);
}
/*化字符为整形,同时计算10进制结果*/
while(sum)
{
x[++p]=sum%m;
sum/=m;
}
/*将10进制结果转化为M进制*/
for(i=p;i>=1;i--)
{
printf("%d",x[i]);
}
/*逆序输出即可*/
return 0;
}
3.上述为正进制,在2000年NOIP提高组(洛谷p1017)有负进制这样的题型
那么其转化重点在于余数位不可为负,只需 余数-=进制; 被除数++; 即向前借位,即可;