Умножение большого целого числа на цифру. Что не так в моем коде? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь решить FCTRL2 в SPOJ. Программа должна уметь вычислять факториал чисел до 100.

Чтобы решить проблему, я должен быть в состоянии умножить большие числа. Чтобы добиться этого, я записал числа в виде строк и применил алгоритм умножения начальной школы. В моем коде есть вспомогательная функция multiply1, которая умножает большое число на цифру. Вот код:

#include <iostream>
#include <string>
using namespace std;
string multiply1(string sx, string sy)
{
    string res(sx.size() + 1, 'x');
    int rem = 0;

    for (int i = sx.size() - 1; i >= 1; i--)
    {
     int ix = sx[i] - '0';
     res[i + 1] = ((ix*(sy[0] - '0') + rem) % 10);
     res.replace(i + 1, i + 2, to_string((ix*(sy[0] - '0') + rem) % 10));
     rem = (ix - (ix % 10)) / 10;

    }
    int ix = sx[0] - '0';
    string last = to_string(ix*(sy[0] - '0') + rem);
    if (last.size() == 1)
    {
        res[1] = last[0]; string res2; 
        for (int i = 1; i < res.size(); i++) 
        { 
            res2[i - 1] = res[i]; 
        }
        return res2; 
    }
    else 
    { 
        res[1] = last[1]; 
        res[0] = last[0]; 
        return res; 
    }
    return res;

}

int main() 
{

    cout << multiply1("155557452", "3");
    return 0;
}

Но я продолжаю получать эту ошибку:

Debug Assertion Failed!

Program: C:\WINDOWS\SYSTEM32\MSVCP140D.dll
File: c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\xstring
Line: 2944

Expression: string subscript out of range

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

Что означает «Ошибка отладки» и как я могу исправить эту ошибку?

1 Ответ

0 голосов
/ 15 января 2019

Когда вы используете Microsoft Visual Studio для отладки программ, скомпилированных в режиме отладки, в ваш код добавляется множество проверок, чтобы предотвратить появление неопределенного или неправильно установленного кода в вашей программе. «Debug Assertion Failed» - это общее сообщение, которое вы получаете, когда обнаружена одна из этих распространенных ошибок, для которых Debug Runtime Library явно тестирует.

Фактическое сообщение, о котором вам нужно позаботиться, приводится в нескольких строках ошибки:

Expression: string subscript out of range

Сообщаем вам, что вы пытаетесь получить доступ за пределами своих строк.

Мое лучшее предположение, что подозрительная строка - это часть кода:

if (last.size() == 1)
{
    res[1] = last[0]; string res2; 
    for (int i = 1; i < res.size(); i++) 
    { 
        res2[i - 1] = res[i]; 
    }
    return res2; 
}

res2 объявляется, но его размер никогда не выделяется или не изменяется. Ваш код просто предполагает, что строка имеет емкость и пытается присвоить ей символы. Это неопределенное поведение, но поскольку ваш компилятор пытается вам помочь, он вместо этого объявляет это как определенное поведение, которое вызывает исключение, и исключение не перехватывается.

Похоже, res2 должен иметь размер, равный размеру res минус 1, поэтому я советую просто вручную изменить размер res2 в этом коде:

if (last.size() == 1)
{
    res[1] = last[0]; string res2; 
    res2.resize(res.size() - 1);
    for (int i = 1; i < res.size(); i++) 
    { 
        res2[i - 1] = res[i]; 
    }
    return res2; 
}

Это должно исправить этот конкретный случай плохого поведения.

Я также предлагаю вам проверить оставшуюся часть кода на наличие ошибок, подобных этой.


Еще одна вещь. Кажется, вы пишете свою собственную целочисленную арифметику произвольной точности. Если это часть школьного задания (или просто то, чему вы пытаетесь научить себя), продолжайте работать над ним, следуя совету, который я дал здесь.

Если, однако, это предназначено для хобби или профессионального проекта, я советую вам вместо этого использовать хорошо зарекомендовавшую себя библиотеку арифметики с произвольной точностью, вместо того, чтобы пытаться изобретать велосипед. Я рекомендую использовать boost.multiprecision или GMP, в зависимости от ваших потребностей разработчика.

...