Разделительный бигинт представлен в строке до 2 - PullRequest
0 голосов
/ 20 марта 2019

Я пишу функцию, которая делит число Big Int (128 бит), представленное в String, на 2. Пример: 8113 - это строка = "8113". Я знаю ошибки моей функции в случае du! = 0. Когда я исправляюкод для входа, другой ввод делают ошибки.Пожалуйста, дайте мне несколько советов для моего решения.Если мой алгоритм так плох, скажите мне лучше, тогда я могу изменить свою функцию другим способом.

int CTOI(char a)
{
    return a - 48;
}

char ITOC(int a)
{
    if (a == 0)
        return '0';
    return a + '0';
}

int creDec(int a, int b)
{
    return (a * 10) + b;
}

string divide2(string str)
{
    string temp = str, t2;
    int du, kq;
    du = CTOI(temp[0]);
    if (du == 1) {
        temp.erase(0, 1);
        while (temp[0] != 0)
        {
            du = creDec(du, CTOI(temp[0]));
            if (du == 1)
            {
                temp.erase(0, 1);
            }
            else
                temp.erase(0, 1);
            kq = du / 2;
            t2 += ITOC(kq);
            du = du - kq * 2;
        }
    }
    else
    {
        while (temp[0] != 0)
        {
            if (du == 1)
            {
                temp.erase(0, 1);
                du = creDec(du, CTOI(temp[0]));
            }
            kq = du / 2;
            t2 += ITOC(kq);
            du = du - kq * 2;
            temp.erase(0, 1);
            du = creDec(du, CTOI(temp[0]));
        }

    }
    return t2;
}

1 Ответ

1 голос
/ 20 марта 2019

Вы, кажется, добавили много ненужной сложности в функцию. Вот упрощенная функция, которая работает для меня с моими тестовыми примерами.

string divide2(string str)
{
   string ret;  // Object to be returned.
   int rem = 0; // Keep track of remainders.

   // Iterate over the characters of the input string.
   auto iter = str.begin();
   auto end = str.end();
   for ( ; iter != end; ++iter )
   {
      int n1 = CTOI(*iter);     // The number from the string.
      int n2 = creDec(rem, n1); // The number after we account for the remainder.
      int n3 = n2/2;            // Result of the division.
      rem = n2%2;               // Remainder of the division.

      if ( ret.empty() && n3 == 0 )
      {
         // Do nothing. There is no need to addd leading zeros to ret.
      }
      else
      {
         // Add the character corresponding to n3 to ret.
         ret.push_back(ITOC(n3));
      }
   }

   // If the return value is an empty string, return "0".
   if ( ret.empty() )
   {
      return "0";
   }
   else
   {
      return ret;
   }
}

Рабочий пример .

Лучше использовать цикл range- for для перебора символов строки.

   for ( char ch : str )
   {
      int n1 = CTOI(ch);     // The number from the string.

       ...
...