阶乘进阶版(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 <stdio.h>

void Print_Factorial(const int N);

int main()
{
	int N;

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

/* 你的代码将被嵌在这里 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

录大大i

如果文章有用,还请鼓励一下作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值