基础的进制转换就是,先取模再整除,如此反复即可得到十进制转二进制的数组,注意输出时倒序输出即可。
数字比较大的进制转换,所以要使用字符串进行存储,难点就在于如何对十进制字符串进行转换。
其中字符串除法是模拟竖式除法,从前往后除,我刚开始的时候开别人的题解就这一点没有明白,举个例子,987654 除以 321,计算步骤如下:
取被除数前三位(除数长度) - 987,除以321,结果是 3 余 24
余数 24 后面再加一位被除数 6 -> 246,但发现不够 321 除,结果添 0
246 再取一位被除数 -> 2465,除以321,结果7 余21
余数 21 再取一位被除数 -> 2184,除以321,结果是6
检查被除数已经取完,运行结束,得到结果 3076
因为这样可能导致字符串前几位有0,可以遍历一下去掉前面的0.
#include#include #include using namespace std; string Divide(string str,int x) { int reminder=0; for(int i=0;i >str) { vector binary; while(str.size()!=0) { int last=str[str.size()-1]-'0'; binary.push_back(last%2);//取模运算 str=Divide(str,2);//整除运算 } for(int i=binary.size()-1;i>=0;i--) { cout< 遇到一个有意思的综合题,先把十进制转成二进制,再把二进制转成十进制
十进制转二进制用的是先取模后除法
二进制转十进制就是先乘法后加法#include#include #include using namespace std; string Divide(string str,int x)//除法 { int remain=0; for(int i=0;i =0;i--) { int current=x*(str[i]-'0')+carry; str[i]=current%10+'0'; carry=current/10; } if(carry!=0) { str="1"+str; } return str; } string Addt(string str,int x) { int carry=x; for(int i=str.size()-1;i>=0;i--) { int current=(str[i]-'0')+carry; str[i]=current%10+'0'; carry=current/10; } if(carry!=0) { str="1"+str; } return str; } int main() { string str; while(cin>>str) { vector binary; while(str.size()!=0) { int last=str[str.size()-1]-'0'; binary.push_back(last%2); str=Divide(str, 2); } string answer="0"; for(int i=0;i



