#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
char str[1000];//输入字符串
int start[1000],ans[1000],res[1000]; //被除数,商,余数
//转换前后的进制
static int oldBase ;
static int newBase ;
void change()
{//各个数位还原为数字形式
int i,len = strlen(str);
start[0] = len;
for(i=1;i<= len;i++)
{
if(str[i-1] >= '0' && str[i-1] <= '9')
{
start[i] = str[i-1] - '0';
}
}
}
void solve()
{
memset(res,0,sizeof(res));//余数初始化为空
int y,i,j;
//模n取余法,(总体规律是先余为低位,后余为高位)
while(start[0] >= 1)
{//只要被除数仍然大于等于1,那就继续“模2取余”
y=0;
i=1;
ans[0]=start[0];
//
while(i <= start[0])
{
y = y * oldBase + start[i];
ans[i++] = y/newBase;
y %= newBase;
}
res[++res[0]] = y;//这一轮运算得到的余数
i = 1;
//找到下一轮商的起始处
while((i<=ans[0]) && (ans[i]==0)) i++;
//清除这一轮使用的被除数
memset(start,0,sizeof(start));
//本轮得到的商变为下一轮的被除数
for(j = i;j <= ans[0];j++)
start[++start[0]] = ans[j];
memset(ans,0,sizeof(ans)); //清除这一轮的商,为下一轮运算做准备
}
}
void output()
{//从高位到低位逆序输出
int i,j;
char answer[1000];
memset(answer,0,sizeof(answer));
for(i = res[0],j=0;i >= 1;j++,--i)
{
answer[j]=res[i]+'0';
// printf("%d",res[i]);
}
string answerstr(answer);
// printf("%s",answer);
cout<<answerstr;
printf("\n");
}
int main()
{
while(1)
{
printf("----请输入要转换的数 : ");
scanf("%s",str);
printf("----请输入当前进制 : ");
scanf("%d",&oldBase);
printf("----请输入要转换的进制: ");
scanf("%d",&newBase);
change();
solve();
printf("----转换成的%d进制数是: ",newBase);
output();
}
return 0;
}