进制转换问题

本文详细介绍了三种进制转换的算法实现,包括十进制到n进制、a进制到b进制以及大数进制转换。通过具体示例和代码展示了不同场景下进制转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题型一:十进制-->n进制

九度1026 A+B

题目描述:

输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。

输入:
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。
输出:
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
样例输入:
8 1300 48
2 1 7
0
样例输出:
2504
1000
#include<stdio.h>
int main(int argc, char* argv[])
{
	_int64 a,b; //注意:对于该题中231-1需要用long long或者_int64
	            //对应的依次是%lld和%I64d
	int n;
	while(scanf("%d %I64d %I64d",&n,&a,&b)!=EOF)
	{
		if(n==0) break;
		_int64 sum;
		sum=a+b;
		int buf[50];
		int size=0;
		do{
			buf[size++]=sum%n;
			sum/=n;
		}while(sum!=0); //关键!用do{}while形式确保输入为0时也有值
		int i;
		for(i=size-1;i>=0;i--) //要倒序输出才是
		{
			printf("%d",buf[i]);
		}
		printf("\n");
	}
	return 0;
}

题型二:a进制-->b进制  

方法:先将a进制数看成字符串来保存,转化成十进制,再将十进制转换为b进制

九度1118 

题目描述:

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

输入:

    输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。

    数据可能存在包含前导零的情况。

输出:

    可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。

样例输入:
15 Aab3 7
样例输出:
210306
提示:

可以用字符串表示不同进制的整数。


#include<stdio.h>
#include<string.h>
int main(int argc, char* argv[])
{
	int a,b;
	char s[50];
	while(scanf("%d %s %d",&a,s,&b)!=EOF)
	{
		int i;
		int x=1; //表示所在的位数
		int ans=0; //表示转化后的十进制数
		int len=strlen(s);
		/*将a进制数转化成十进制数*/
		for(i=len-1;i>=0;i--)
		{
			int c;
			if(s[i]>='0'&&s[i]<='9')
			{
				c=s[i]-'0';
			}
			if(s[i]>='A'&&s[i]<='F')
			{
				c=s[i]-'A'+10;
			}
			if(s[i]>='a'&&s[i]<='f')
			{
				c=s[i]-'a'+10;
			}
			ans+=c*x;
			x=x*a;
		}
		/*将十进制数转化成b进制数*/
		int buf[50];
		int size=0;
		do{
			buf[size++]=ans%b;
			ans=ans/b;
		}while(ans!=0);
		/*输出b进制数*/
		for(i=size-1;i>=0;i--)
		{
			printf("%d",buf[i]);
		}
		printf("\n");
	}
	return 0;
}

题型三:大数(BIG integer)的进制转换

方法:要模拟人工除法计算

九度1138

题目描述: 
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入: 
多组数据,每行为一个长度不超过30位的十进制非负整数。
 (注意是10进制数字的个数可能有30个,而非30bits的整数)
输出: 
每行输出对应的二进制数。
样例输入:

 0
1
3
8
样例输出:

0
1
11
1000


#include<stdio.h>
#include<string>
int main(int argc, char* argv[])
{
	char a[40];
	int b[40];
	int i;
	while(scanf("%s",a)!=EOF)
	{
		for(i=0;a[i]!=0;i++)
		{
			b[i]=a[i]-'0';
		}
		int ans[40];
		int j=0;
	
		while(1){	
			int temp=0;
			i=0;
			if(b[i]==0&&i<strlen(a))	i++; //处理前导0
			if(i==strlen(a))	break;  //当全是0的时候意味着已经处理到了结尾
			/*模拟手算除法*/
			for(;i<strlen(a);i++)
			{
				temp=10*temp+b[i];
				b[i]=b[i]/2;
				temp=temp%2; //每次的余数即进位
			}
			ans[j++]=temp;
		}

		if(j==0)  
                    printf("0\n");
		else{
			for(i=j-1;i>=0;i--)
			{
				printf("%d",ans[i]);
			}
			printf("\n");
		}
		
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值