题目描述
题目:https://vjudge.net/problem/HDU-1042
就是输入一个数n,然后要你输出n!。但是,注意范围:0<=n<=1000,所以只能用数组模拟千进制来存储数据。例如:1234567890在数组中应该存储为[7890,3456,12],输出的时候你这输出就是1234567890。
思路分析
其实上面已经说了点了。这里因为主要用到的是乘法,所以这里需要重载的是*运算符。另外,方便输出,需要写个输出函数(pr())(这里不重载<<,因为补0的话应printf更方便一些。)
相乘的时候,我们应该对每一位都乘以乘数,然后再对每一位的进位情况进行处理:数组的每个元素超过1000,就需要%1000,/1000进位,直到循环到一位为0,还要记得更新一下p(代表位数)
完整代码
#include <iostream>
#include <ostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct bignum {
int num[100000];
long long p;
bignum(int n)
{
memset(num, 0, sizeof(num));
num[0] = n;
p = 1;
}
friend bignum& operator*(bignum& a, int n)
{
for (int i = 0; i < a.p; i++)
{
a.num[i] *= n;
}
if (a.num[a.p-1] >= 1000)
{
a.p++;
}
int i;
for (i = 0; i<a.p||a.num[i]!=0; i++)
{
int t = a.num[i];
a.num[i] = t % 1000;
a.num[i + 1] += t / 1000;
}
a.p = i;
return a;
}
void pr()
{
printf("%d", num[p - 1]);
for (int i = p - 2; i >= 0; i--)
{
printf("%03d", num[i]);
}
}
};
int main()
{
int n;
while (cin >> n)
{
bignum result(1);
for (int i = 1; i <= n; i++)
{
result = result * i;
}
result.pr();
cout << endl;
}
return 0;
}