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

文章目录

    • 进制转换基本方法
    • 题目
      • 进制转换


进制转换基本方法

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
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

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