0

我决定使用字符串来实现加法,因为我的数字可能很大。我面临的问题是如何将字符串中的十进制数字转换为二进制。如果lol是加法的结果,我正在尝试使用以下方法将其转换为二进制形式:

unsigned long long function_arg = atoi( lol.c_str() );

随着位数的增加,例如n>14,它失败了,所以甚至long long太短了。你能建议我做什么?这实际上是我的程序的代码(使用十进制系统):

#include <iostream>
#include <string>
#include <bitset> 
#include <conio.h>

using namespace std;

string add (string &s1, string &s2) {
  int carry=0,sum,i;
  string  min=s1,
  max=s2,
  result = "";

  if (s1.length() > s2.length()) {
    max = s1;
    min = s2;
  } else {
    max = s2;
    min = s1;
  }

  for (i = min.length()-1; i>=0; i--) {
    sum = min[i] + max[i + max.length() - min.length()] + carry - 2*'0';

    carry = sum/10;
    sum %=10;

    result = (char)(sum + '0') + result;
  }

  i = max.length() - min.length()-1;

  while (i>=0) {
    sum = max[i] + carry - '0';
    carry = sum/10;
    sum%=10;

    result = (char)(sum + '0') + result;
    i--;
  }

  if (carry!=0) {
    result = (char)(carry + '0') + result;
  }       

  return result;
}


string Dex_To_bin(unsigned long long number){
  string result;
  unsigned long long bitmask = 1ULL << 63;
  do
    result.push_back(static_cast<bool>(number & bitmask));
  while (bitmask >>= 1);
  return result;
}


int main () {
  string a,b;
  cin >> a >> b;
  add(a,b);
  cout << add(a,b) << endl;
  cout << endl;
  cout << endl;
  string lol=add(a,b);
  unsigned long long funtion_arg = atoi( lol.c_str() );
  cout << Dex_To_bin(funtion_arg) << bitset<64>(funtion_arg) << endl;
  cin.get();
  cin.ignore();
  getch();
  return 0;
} 

功能add很好用,问题出在Dec_to_Bin:(

4

2 回答 2

0

你能建议我做什么?

不。一个大的值不能转换为一个太小的类型。你的 API 中根本不需要这个方法,或者至少你不需要。

顺便说一句,您设计的方法签名没有意义。参数应该是一个“字符串”,结果应该是一个“long long”。但不要提供。

于 2013-09-17T22:49:23.740 回答
0

您正在使用字符串来表示非常长的数字,对吗?不适合标准数字类型的数字?结果没有什么不同。考虑制作一组以数字表示为字符串的函数。这是他们被允许处理数字的唯一方法。

因此,编写十进制到二进制函数以直接获取字符串,并一次转换字符串的一位数字。

于 2013-09-17T21:36:54.453 回答