工作中的算法(一)

大数十进制转换二进制

普通的进制转换

使用int 或者long long 来转换字符串 使用/2与%2 来获取答案

string Num2bit( const string & input ){
  long long num = 0 ;
  int n = input.size() ;
  for( int i=0 ; i< n ; i++){ // 不考虑负数的情况
    num = num*10 + input[i] -'0' ;
  }
  string ans ;
  while( num ){
    ans.push_back( num % 2 +'0') ;
    num /= 2;
  }
  reverse( ans.begin() , ans.end() ) ;
  return ans ;
}

我们知道当字符串的输入大于18位时64位整数无法存下转换后的整数从而发生溢出这个时候如何处理

其实还是使用一样的方法我们仍然模拟这样的计算只是保证计算的时候没有发生溢出

我们把每个字符当成一个数组的元素如

string = “21476724”(因为篇幅没有使用超过18位的例子)

data[i] = {2,1,4,7,6,7,2,4}

那么第一次模拟第一次计算的过程

先取出data[0] ,计算data[0]/2和data[0]%2 分别为1和0

接着data[0]更新为data[0]/2

取出data[1] ,使用data[0]%2后的结果*10+data[1]得到 temp_val

计算temp_val/2 和 temp_val % 2

更新data[1] …. 反复计算更新data[i]

计算后的data[i]={1,0,7,3,8,3,6,2} 最后一次计算的temp_val 放入结果中

反复计算至data[i] 全部为0

string BigNum2bit( const string & input ){
  int data[1001];
  memset( data,0,sizeof( data ) ) ; //(使用memset是两字节填充的)
  string ans ;
  int sum =1 ;
  int n = input.size() ;
  for( int i=0 ; i<n ; i++){
    data[i] = input[i]-'0';
  }
  while( sum ){
    sum =0 ;
    int m = data[0]%2  ;
    data[0] = data[0]/2 ;

    for( int i=1;  i< n ; i++){
      sum+=data[i];
      int val = m*10+data[i] ;
      data[i] = val/2;
      m = val%2 ;
    }
    ans.push_back( m+'0');
  }
  reverse( ans.begin() ,ans.end() );
  while( ans[0]=='0'){
      ans.erase( 0 , 1 ) ;
  }
  return ans ;
}

猜你喜欢

转载自blog.csdn.net/weixin_38739799/article/details/79522440