阶乘进阶版(leetcode)

阶乘进阶版

分析:由于N最大为1000,
int的范围最大为10的9次方,
long long int的范围最大为10的18次方,
使用斯特林公式计算可知,n为12时,结果的位数已经为9,
故N取1000一定远远超过了long long Int的范围,
故应该考虑用模拟乘法的方法计算。

//阶乘计算升级版
//大数乘法
/*
最外层是算阶乘
第二层for循环模拟乘法
temp算当前位的乘法
arr[j] 填上当前位乘法的最后一位
然后赋值n为 进位的数
最后for循环结束出来
进位的n还有没有填完的
进while循环
在往后面填数
k++
把 for循环结束的arr 输出一下看看就知道了
*/
void Print_Factorial(const int N)
{
	int temp = 0, k = 1, n = 0;
	int arr[3000] = { 0 };

	if (N < 0)
	{
		printf("Invalid input");
	}
	else
	{
		arr[0] = 1;
		for (int i = 2; i <= N; i++)
		{
			for (int j = 0; j < k; j++)
			{
				temp = arr[j] * i + n;
				arr[j] = temp % 10;
				n = temp / 10;
			}
			while (n)
			{
				arr[k++] = n % 10;
				n /= 10;
			}
		}
		for (int i = k - 1; i >= 0; i--)
		{
			printf("%d", arr[i]);
		}
	}
}


#include 

void Print_Factorial(const int N);

int main()
{
	int N;

	scanf_s("%d", &N);
	Print_Factorial(N);
	return 0;
}

/* 你的代码将被嵌在这里 */

你可能感兴趣的:(leetcode,算法,c++)