主要思想:模仿手算除法。
举例:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
思路:相当于是不断除以2,直到为0(大数除法的循环),关键是记录每一次除法的余数。注意点:
1. 经典的while循环:注意每一次除法结束后,通过对num[]前导零的判断,以确定位数有没有减少(即控制被除数开始的位置)。
2.考虑十进制转二进制的实际过程,结果ans[]需要倒序输出。
注意:可以实现任意进制之间的转换
(夏令营常考机试题。2019年中国人民大学、中国科学技术大学夏令营机考题)
#include<iostream>
#include<cstring>
using namespace std;
int main(void)
{
char str[31];
int num[31];
while(cin>>str)
{
for(int i=0;i<strlen(str);i++){//转化成数字
num[i]=str[i]-'0';
}
int ans[120]={0};
int index = 0;//结果游标
int len = strlen(str);
for(int i=0;i<len;)//控制被除数开始位置
{
/*除法,并将余数记录下来*/
int remain = 0;
for(int j=i;j<len;j++){
remain = 10 * remain + num[j];
num [j] = remain / 2;
remain = remain % 2;
}
ans[index] = remain;
index++;
/*除法,并将余数记录下来*/
while(num[i]==0) i++;
//从非0元素开始继续做除法,控制下次除法开始的位置
}
for(int i=index-1;i>=0;i--)
{
cout<<ans[i];//这里要倒序输出
}
cout<<endl;
}
return 0;
}