我正在尝试查找大量的阶乘
我输入了测试用例数
以及在每种情况下我要查找其阶乘的数字
我正在将阶乘的数字存储在向量中(动态数组)
并且每次将其乘以递减的n的值
功能显示:显示矢量v中的所有数字
#include <iostream>
#include <vector>
using namespace std;
void display(vector<int> v)
{
for(int x : v)
{
cout << x;
}
cout << endl;
}
vector <int> factorial(int n)
{
vector <int>v;
if(n > 9)
{
int n1 = n;
int r;
while(n1 != 0)
{
r = n1 % 10;
n /= 10;
v.insert(v.begin(), r);
}
}
else
{
v.push_back(n);
}
--n;
int pdt;
int carry = 0;
int digit;
while(n != 1)
{
for(int i = v.size() - 1; i >= 0; --i)
{
pdt = v[i] * n + carry;
carry = pdt / 10;
digit = pdt % 10;
v.insert(v.begin() + i, digit);
// display(v);
}
if(carry != 0)
{
if(carry > 9)
{
int n1 = n;
int r;
while(n1 != 0)
{
r = n1 % 10;
n /= 10;
v.insert(v.begin(), r);
}
}
else
{
v.insert(v.begin(), carry);
}
}
carry = 0;
--n;
}
return v;
}
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >>n;
vector <int> v;
v = factorial(n);
display(v);
}
}
n = 5的输出
1264221101505
此外,使用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);
}
}