每日一算法:大数的阶乘

由于int有其本身的范围,所以,求阶乘很容易溢出


为此

我们用一个数组a[n]来存放阶乘结果的每一位,阶乘从1开始,a[0] = 1


1*2 = 2;       a[0] = 2;
2*3 = 6;       a[0] = 6;
6*4 = 24;      a[0] = 4,a[1] = 2;
24 * 5 = 120   a[0] * 5 = 20,2进位,a[0] = 0, a[1] * 5 = 10,1进位,a[1] = 0+2 = 2; a[2] = 2;
120*6 = 720    a[0] * 6 = 0,a[0] = 0, a[1] * 6 = 12,1进位,a[1] = 2; a[2] * 6 = 6,在加上进位的1,也就是a[2] = 6+1 = 7
后面一样....................................................................


为此,我们需要两个循环,从1....n,n的阶乘
存储结果后的数组有多少位参与运算,1....total
还需设置一个进位标志flag。


#include <stdio.h>

char per[1000000];  /*保存结果的每一个位*/
int  total;       /*结果的位数*/

void fact(int num)
{
	int i,j,flag,temp; /*flag是进位标志*/
	per[0] = 1;
	total = 1;
	for (i=1,flag = 0; i<=num; i++)
	{
		for (j=0,temp = 0; j<total; j++)
		{
			temp = per[j] * i + flag;           /*数组的每一位与i相乘*/
			per[j] = temp % 10;                 /*每一位小于10*/
			flag = temp / 10;                   /*所进的位数*/
		}
		while (flag)
		{
			per[total] = flag % 10;
			total++;
			flag = flag / 10;
		}
	}
}

int main()
{
	int i, number;
	printf("Please input a number:");
	scanf("%d",&number);
	fact(number);
	printf("%d! = ",number);
	for (i=total-1; i>=0; i--)
	{
		printf("%d",per[i]);
	}

	printf("\n一共%d位!\n",total);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值