进制转换(m 进制 x 转换为 n 进制的数)

摘要:以前写的进制转换一般不会考虑大数问题,举个例子就是如果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;
} 

猜你喜欢

转载自blog.csdn.net/qq_44859533/article/details/108684510