2013-09-17 3 views
0

Я решил реализовать добавление, используя строки, так как мои цифры могут быть огромными. Проблема, с которой я сталкиваюсь, заключается в том, как преобразовать из десятичных чисел в строки в двоичный. Если lol является результатом того, что я пытаюсь преобразовать его в двоичной форме с использованием:Преобразование строки с использованием длинной арифметики

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

Поскольку число цифр растет, как, например, п> 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 :(

+0

Пожалуйста, правильно скорректируйте свой код. Плохо отформатированный код показывает лень, и люди здесь менее склонны помогать ленивым кодировщикам. –

+4

И почему бы вам не использовать библиотеку для этого - например [GMP] (http://gmplib.org/)? Это было бы намного быстрее и надежнее. – Tometzky

+0

Если вы, конечно, не делаете это в образовательных целях ... :-) – nickie

ответ

0

Вы используете строки для представления очень длинных чисел, право «Номера, которые не будут вписываться в стандартные числовые типы?» Результат не отличается. Думайте о создании набора функций, которые принимают числа, представленные как строки. Это единственный способ разрешить номера.

Итак, напишите свою десятичную двоичную функцию, чтобы взять строку напрямую и преобразовать ее цифры строки за раз.

0

Что вы можете посоветовать мне делать?

Нельзя. Большое значение не может быть преобразовано в слишком малый тип. Вам вообще не нужен этот метод в вашем API, или, по крайней мере, вы не должны этого делать.

Кстати, подпись метода, которую вы разработали, не имеет смысла. Параметр должен быть «строкой», а результат должен был быть «длинным долго». Но не предоставляйте его.

Смежные вопросы