算法笔记 — 进制转换(大数运算-十进制转二进制)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37345402/article/details/83689894

题目链接:http://www.codeup.cn/problem.php?cid=100000579&pid=2

题目描述

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

输入

多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)

输出

每行输出对应的二进制数。

样例输入

985
211
1126

样例输出

1111011001
11010011
10001100110

大数以字符串的形式输入,转化为每位的数字形式,先判断是否为0,如果为0直接输出0.

在while(1)循环中,如果数字变为0结束循环;将对个位数字取余的结果放到数组中保存,再通过for循环将这个大数除以2(例如541/2→5/2=2...1→(2*10+4)/2=7→→541/2的结果为270余1)

我真的被自己菜哭了。。。

#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
char ss[33];
int s[33]; 
char ans[1111];
int main(){
    while(cin>>ss){
    	int len=strlen(ss);
    	int cnt=0;
    	for(int i=0;i<len;i++){
    		s[i]=ss[i]-'0';
		}
		//如果输入数字为0,则输出0 
		bool f=1;
		for(int i=0;i<len;i++){
			if(s[i]){
				f=0;
				break;
			}
		}
		if(f){
			cout<<"0"<<endl;
			continue;
		}
		while(1){
			//数字为0,循环结束 
			bool flag=1;
			for(int i=0;i<len;i++){
				if(s[i]){
					flag=0;
					break;
				}
			}
			if(flag){
				break;
			}
			//存最后一位对2取模 
			ans[cnt++]=s[len-1]%2+'0';
			//大数除以2 
			for(int i=0;i<=len-1;i++){
				if(s[i]%2==1){
					s[i]/=2;
					s[i+1]+=10; 
				} else{
					s[i]/=2;
				}
			}
		}
        for(int i=cnt-1;i>=0;i--){
            cout<<ans[i];
        }
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37345402/article/details/83689894