求解
  • 板块题目总版
  • 楼主Vizzi_02
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/6/12 20:25
  • 上次更新2023/11/7 00:47:44
查看原帖
求解
341396
Vizzi_02楼主2020/6/12 20:25

题目输入整数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;
}
2020/6/12 20:25
加载中...