进制转换基本方法
P进制转换为Q进制
- 将P进制数x转换为十进制数y
int y=0,pr=1;
while(x)
{
y=y+(x%10)*pr;
x=x/10;
pr=pr*p;
}
- 将十进制数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