PTA_基础编程题目集_6-10 阶乘计算升级版 (20 分)“大数阶乘”

  • 题目地址
  • 题目分析:

1.预估1000!的位数~~进行放大估计~~1000^900&100^100即是3*900+2*100+o<3000位

2.这里显然需要利用数组来保存数字并进行运算,让数组成员每个保存3位数字(题目条件已告知参数小于1000),我们构建1200个成员的数组(3600位);

3.难点在于我们对数组成员间相乘、进位的考虑,这里容易误入歧途;这里本质上来讲,与就是把十进制转化为千进制,而转化为千进制的一个重要原因在于我们将多位数*多位数的复杂情况转化为了单位数*多位数的简单情况进行运算,具体细节见下面代码。

  • 我的代码
void Print_Factorial(const int N)
{
        int n = N;
	if (n < 0)
		printf("%s", "Invalid input");
	if (n == 0 || n == 1) 
		printf("%d", 1);

	/*
	数字运算时:
	该算法通过数组控制,使得每次都进行 同位数*同位数 (可以小,不能大)运算,
	且将 大数乘法 -> 个位*多位。

	同位数*同位数=本位数+进位数:
	(在 个位*多位 的情况下)
        进位数+进阶本位数 < 进位值(一个简单的乘法规律)

	从而不产生多次相加的连续进位问题
	*/

	if (n > 1)
	{
		int a[1200] = { 1,0 }, len = 1;//一个数组,一个位数指标len	

		for (int c, j; n > 1; n--)//这里的进阶c设计的非常巧妙
		{
			for (j = 0, c = 0; j < len; j++)//通过j让多位的每位被乘
			{
				int p = a[j] * n + c;
				a[j] = p % 1000;
				c = p / 1000;
			}
			c > 0 ? a[j] = c, len++ : 0;//一次单位*多位的最后一次c的运算
		}

		printf("%d", a[len - 1]);//注意打印格式的规范化
		for (int m = len - 2; m >= 0; m--) 
			printf("%03d", a[m]);
	}
}
  • 参考文章:4行代码计算9999的阶乘
 
 
 

你可能感兴趣的:(PTA基础)