В коде было несколько проблем. Основным является то, что текущий вектор никогда не изменяется: каждый раз, когда обнаруживается новый di git, он вставляется. Была также проблема использования одной переменной вместо другой.
Более того, код может быть значительно упрощен с условием, что v[0]
соответствует LSB, а не MSB.
Была также возможность упростить код, избегая ненужных тестов, как if (n > 9 ....)
.
Вот рабочий код:
#include <iostream>
#include <vector>
void display (std::vector<int> &v) {
for (int i = v.size() -1 ; i >= 0; --i) {
std::cout << v[i];
}
std::cout << "\n";
}
std::vector<int> factorial (int n) {
std::vector<int> v;
v.push_back(1);
while (n != 1) {
int carry = 0;
for (int i = 0; i < v.size(); ++i) {
int pdt = v[i] * n + carry;
carry = pdt / 10;
v[i] = pdt % 10;
}
while (carry != 0) {
int r = carry % 10;
carry /= 10;
v.push_back(r);
}
--n;
}
return v;
}
int main() {
int t;
std::cin >> t;
while (t--) {
int n;
std::cin >> n;
auto v = factorial(n);
display(v);
}
}