摘要:以前写的进制转换一般不会考虑大数问题,举个例子就是如果16进制的FFFFFFFFF就是16^9是一个非常大的数,这个时候就需要用数组来存。

题目:
将M进制的数X转换为N进制的数输出。

输入

输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。

输出

输出X的N进制表示的数。

样例输入

10 2
11

样例输出

1011

提示

注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。

**解题思路:**这个题主要是模拟进制转换的过程写的,运行一遍代码就可以看懂。。

程序代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
char s1[1000],c[1000];
int a[1000],b[1000];
int main()
{
int i,j,k,m,n,x,t,s,sum,v,w;
scanf("%d%d",&m,&n);
scanf("%s",s1);
t=strlen(s1);
//先转换为十进制
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
k=1;
for(i=0;i<t;i++)
{
for(j=0;j<k;j++)
a[j]=a[j]*m;
if(s1[i]>='0'&&s1[i]<='9')
a[0]=a[0]+s1[i]-'0';
else if(s1[i]>='A'&&s1[i]<='Z')
a[0]=a[0]+s1[i]-'A'+10;
v=0;
for(j=0;j<k;j++)
{
a[j]=a[j]+v;
if(a[j]>=10)
{
v=a[j]/10;
a[j]=a[j]%10;
}
else
v=0;
}
while(v)
{
a[k++]=v%10;
v=v/10;
}
}
j=0;
//把十进制的数顺序掉一下
for(i=k-1;i>=0;i--)
b[j++]=a[i];
/* for(i=0;i<j;i++)
printf("%d",b[i]);
printf("\n");
printf("%d\n",k);*/
//*************************************//
sum=1;s=0;
//十进制转换n进制
while(sum)
{
sum=0;
for(i=0;i<k;i++)
{
v=b[i]/n;
// printf("******%d\n",v);
sum+=v;
if(i==k-1)
{
t=b[i]%n;
// printf("&&&&&&&%d\n",t);
if(t<=9)
c[s++]=t+'0';
else
c[s++]=t-10+'a';
}
else
{
b[i+1]=b[i+1]+b[i]%n*10;
//printf("+++++%d %d\n",i,b[i+1]);
}
b[i]=v;
}
}
for(i=s-1;i>=0;i--)
printf("%c",c[i]);
printf("\n");
return 0;
}