进制转换专题

文章目录

  • 进制转换算法
  • codeup习题
    • Problem A: 又一版 A+B
    • Problem B: 数制转换
    • Problem C: 进制转换
    • Problem D: 八进制

进制转换算法

将一个P进制的数转换为Q进制,需要分为两步:
一,将P进制数x转换为十进制数y:

	int y=0,product=1;
	while(x!=0){
		y+=(x%10)*product;
		x/=10;
		product*=P;
	}

二,将十进制数y转换为Q进制数z:

	int z[20],num=0;
	do{
		z[num++]=y%Q;
		y/=Q;
	}while(y!=0);//这里用do...while的循环结构是用于处理y=0的特例
	for(int i=num-1;i>=0;i--){//将所有余数倒着输出即得到z
		printf("%d",z[i]);
	}

codeup习题

Problem A: 又一版 A+B

输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数,输入的两个数相加后的结果可能会超过int和long的范围。
输入格式:一行中输入m,A,B,当m输入0时结束。

#include
int main(){
	int m;
	while((scanf("%d",&m)!=EOF)&&m!=0){
		long a,b;
		scanf("%lld%lld",&a,&b);
		//scanf("%I64d%I64d",&a,&b);
		long long c=a+b;
		int num=0;
		int arr[1000];
		do{
			arr[num++]=c%m;
			c/=m;
		}while(c!=0);
		for(int i=num-1;i>=0;i--){
			printf("%d",arr[i]);
		}
		printf("\n");
	}
	return 0;
} 

一定注意若a和b使用int类型,则会导致结果出错。可以使用long类型也可以在加法运算时进行强制类型转换。
开始读错题目,以为a和b相加的结果超出long long类型的范围,采用下面这种比较复杂的做法,先分别将a和b进行进制转换,然后再把两个做加法得到最终结果。

#include
int main(){
	int m,a,b;
	scanf("%d",&m);
	while(m!=0){
		scanf("%d%d",&a,&b);
		int ma[100]={},mb[100]={};
		int na=0;
		do{
			ma[na++]=a%m;
			a/=m;
		}while(a!=0);
		int nb=0;
		do{
			mb[nb++]=b%m;
			b/=m;
		}while(b!=0);
		//m进制加法 
		int i;
		for(i=0;i<na||i<nb;i++){
			ma[i]+=mb[i];
			if(ma[i]>=m){
				ma[i]-=m;
				ma[i+1]++;
			}
		}
		if(ma[i]!=0)
			printf("%d",ma[i]);
		for(int j=i-1;j>=0;j--){
			printf("%d",ma[j]);
		}
		printf("\n");
		scanf("%d",&m);
	}
	
	return 0;
}

Problem B: 数制转换

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。输出时符号用大写表示。

#include
#include

int main(){
	int a,b;
	char n[40];
	while(scanf("%d%s%d",&a,n,&b)!=EOF){
		int x=0,product=1;
		int len=strlen(n);
		for(int i=len-1;i>=0;i--){
			int tmp;
			if(n[i]>='0'&&n[i]<='9'){
				tmp=n[i]-'0';
			}
			else if(n[i]>='a'&&n[i]<='z'){
				tmp=n[i]-'a'+10;
			}
			else{
				tmp=n[i]-'A'+10;
			}
			x+=tmp*product;
			product*=a;
		}
		char y[40];
		int num=0;
		do{
			int tmp=x%b;
			if(tmp>=0&&tmp<=9){
				y[num++]=tmp+'0';
			}
			else{
				y[num++]=tmp+'A'-10;
			}
			x/=b;
		}while(x!=0);
		for(int i=num-1;i>=0;i--){
			printf("%c",y[i]);
		}
		printf("\n");
	}
	return 0;
} 

Problem C: 进制转换

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
思路是将字符数组格式的十进制整数模拟竖式除以二的运算,每次除以二都将最后一个余数保存在结果数组中,直到字符数组全为0。倒着输出结果数组,即为转换后的二进制数。

#include
#include
int main(){
	char str[40];
	char zero[40];
	while(scanf("%s",str)!=EOF){
		int len=strlen(str);
		int i;
		for(i=0;i<len;i++){
			zero[i]='0';
		}
		zero[i]='\0';
		int num=0;//记录进行取余运算的次数 ;
		int ans[100];
		do{	//完成一次完整运算 
			
			int rem;//记录余数 
			int flag=0; 
			for(i=0;i<len;i++){//进行一次除以2的操作 
				int tmp=str[i]-'0';
				if(flag==1)
					tmp+=10; 
				str[i]=(tmp/2)+'0';
				rem=tmp%2;
				if(rem==1)
					flag=1;
				else
					flag=0; 
			}
//			for(i=0;i
//				printf("%c",str[i]);
//			}
//			printf("\n");
			ans[num++]=rem;
		}while(strcmp(str,zero)!=0);
		for(i=num-1;i>=0;i--){
			printf("%d",ans[i]);
		}
		printf("\n");
	}
	return 0;
}

Problem D: 八进制

输入一个十进制数(整型范围内),输出其八进制。
过于简单。

#include
#include
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		int ans[100];
		int num=0;
		do{
			ans[num++]=n%8;
			n/=8;
		}while(n!=0);
		for(int i=num-1;i>=0;i--){
			printf("%d",ans[i]);
		}
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(算法笔记,算法笔记)