算法笔记 3.5 进制转换 练习题

本文探讨了一种处理大整数进制转换的方法,针对长度不超过30位的十进制非负整数,将其转换为二进制表示。由于数值范围超出long long int类型限制,采用字符串存储并逐位进行取余运算。通过示例详细解释了转换过程,并提供了C++代码实现。这种方法适用于处理大整数的进制转换问题。

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


进制转换基本方法

P进制转换为Q进制

  1. 将P进制数x转换为十进制数y
int y=0,pr=1;
while(x)
{
  y=y+(x%10)*pr;
  x=x/10;
  pr=pr*p;
}
  1. 将十进制数y转换Q进制数z
int z[100],num=0; 
do
{
  z[num++]=y%Q;
  y=y/Q;
}while(y);

最后倒着输出z数组即可

题目

进制转换

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

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string n;             
    while(cin>>n)
	{ 
        int len=n.length();
	    int	i=0;
		char num[200];
		int k=0, cf, j,temp;  //cf是进位 
		while(i<len)
		{
			num[k++] = ((n[len-1]-48) % 2) + 48;  
			cf=0;
			for(j=i; j<len; j++)
			{
				temp = n[j]-48; 
				n[j] = (n[j]-48 + cf)/2+48; 
				if(temp % 2 == 1)
					cf = 10;
				else
					cf = 0;		 
			}
			if(n[i] == '0') //高位如果变为0,处理下一个位置
				i++;			 
		}		
		for(j=k-1; j>=0;j--)
		cout<<num[j];
		cout<<endl;
	}		
	return 0;	
} 


  看似是一道简单的十进制数转二进制数问题,但是根据题目所给数值范围发现long long 的整型都无法表示最大十进制数值。所以只能用字符串存储该十进制数,然后再一位一位进行取余运算。
  例如:十进制数27,尾数7,7%2=1,7/2=3,num[0]=1;再后首位2,2/2=1,由于首位是偶数,偶数可以整除2,所以低位2+0=2,让低位这个数来除,(2+0)/2=1,从而n[]数组即原来的整数变成n[]={1,3}。继续取余,尾数3,3%2=1,num[1]=1;再看首位1,1/2=0,由于首位是奇数,奇数不能整除2,所以低位3+10=13,让低位这个数来除,(3+10)/2=6,从而n[]数组变为n[]={0,6},再循环上述过程。数组的值依次变成:{0,3}->{0,1}->{0,0}, 过程中num[]={1,1,0,1,1}。所以27 = (11011) 2 {_2} 2

long long int型的范围大约是10^18,不足以表示10^30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值