题目输入整数n, 计算n的阶乘n!, 并输出阶乘的位数和前k位数. n!=1×2×3×⋯×n 规定0的阶乘等于1
【输入格式】 2个正整数n,k, 用空格分隔
【输出格式】 两行 第1行输出n的阶乘的位数 第2行输出n的阶乘的前k位数
【输入样例#1】 10 3
【输出样例#1】 7 362
【输入样例#2】 50 50
【输出样例#2】 65 30414093201713378043612608166064768844377641568960
【数据说明】 1≤n≤400 保证k小于n!的位数 400!不超过1000位
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct BIG
{
static const int MR = 1010;
int l;//表示整数位数
int num[MR];
//构造函数
BIG()
{
memset(num, 0, sizeof(num));
l = 1;
}
//单精度化高精度
void set(int n)
{
memset(num, 0, sizeof(num));
l = 0;
while(n > 0)
{
l++;
num[l] = n % 10;
n /= 10;
}
if(l == 0) l++;
}
//字符串化高精度
void set(string s)
{
memset(num, 0, sizeof(num));
l = s.length();
for (int i = 1; i <= l; i++)
{
num[i] = s[l - i] - '0';
//数组x和十进制写法是反过来存储的
}
}
void print()
{
//从高位输出到低位
for (int i = l; i >= 1; i--)
{
printf("%d",num[i]);
}
printf("\n");//最后要输出一个换行
}
};
bool operator< (const BIG& a, const BIG& b)
{
if(a.l != b.l) return a.l < b.l;//位数少的较小
//若位数相等,从高位开始比较
for (int i = a.l; i >= 1; i--)
{
if (a.num[i] != b.num[i]) return a.num[i] < b.num[i];
}
return false;//如果运行到这一步,说明两个数完全相同
}
bool operator> (const BIG& a, const BIG& b) {return b < a;}
bool operator== (const BIG& a, const BIG& b) {return !(b<a) && !(a<b);}
bool operator!= (const BIG& a, const BIG& b) {return b < a || a < b;}
bool operator<= (const BIG& a, const BIG& b) {return !(b < a);}
bool operator>= (const BIG& a, const BIG& b) {return !(a < b);}
BIG operator+ (const BIG& a, const BIG& b)
{
BIG t;
t.l = max(a.l, b.l);
for (int i = 1; i <= t.l; i++)
t.num[i] = a.num[i] + b.num[i];
for (int i = 1; i <= t.l; i++)
{
t.num[i + 1] += t.num[i] / 10;
t.num[i] %= 10;
}
while (t.num[t.l + 1] > 0) t.l++;
return t;
}
BIG operator- (const BIG& a, const BIG& b)
{
BIG t;
t.l = max(a.l, b.l);
for (int i = 1; i <= t.l; i++)
t.num[i] = a.num[i] - b.num[i];
for (int i = 1; i <= t.l; i++)
{
if (t.num[i] < 0)
{
t.num[i + 1] -= 1;
t.num[i] += 10;
}
}
while (t.num[t.l] == 0 && t.l > 1) t.l--; // 找到最高的非零位
return t;
}
BIG operator* (const BIG& a, const int& b)
{
BIG t;
t.l = a.l;
for (int i = 1; i <= t.l; i++)
t.num[i] = a.num[i] * b;
for (int i = 1; i <= t.l; i++)
{
t.num[i + 1] += t.num[i] / 10;
t.num[i] %= 10;
}
while (t.num[t.l + 1] > 0)
{
t.l++;
t.num[t.l + 1] += t.num[t.l] / 10;
t.num[t.l] %= 10;
}
return t;
}
BIG operator* (const int& b, const BIG& a)
{
return a * b;
}
BIG operator/ (const BIG& a, const int& b)
{
BIG t;
t.l = a.l;
int yu = 0; //记录余数
//从最高位开始除
for(int i = t.l; i >= 1; i--)
{
int bei = yu * 10 + a.num[i];
t.num[i] = bei / b;
yu = bei % b;
}
while (t.num[t.l] == 0 && t.l > 1) t.l--; //找到最高的非零位
return t;
}
BIG F[460];
int main()
{
int n,k;
cin >> n >> k;
F[0].set(1);
for(int i = 1;i <= n;i++)
{
F[i] = F[i - 1] * i;
}
F[k].print();
F[n].print();
return 0;
}