ACM 大数运算 【计算1000以内的阶乘】

题目:

输入不超过1000的正整数N,输出N!=1x2x3x4……xN的精确结果

样例输入:30
样例输出:265252859812191058636308480000000


思路:由于数值过大,无法用任何类型的将其保存,故使用乘法的基本算式求解。

例子:
ACM 大数运算 【计算1000以内的阶乘】_第1张图片
用一个len去记录当前的结果有多少位,每次用已经存储(用大数组存储)的数的每一位去乘以需要乘的值,然后用相乘所得的值与进位值相加然后再取10的余数取更新当前位置的值。  直到最后一位乘了以后如果进位值不为0继续往上进位。

比如上图中说第一次进行
5 X 3 = 15   进位值默认为0 则(15 + 0)%10获得的值去更新当前位置的值  5 更新为 5

最后一次后 3 更新为 0 ,检测到进位值不为0,则进位。


以下为代码:
#include 
#include 
#include  
#include 
using namespace std;
int main()
{
	int n;//定义n 
    while(scanf("%d",&n) != EOF)//循环输入 
    {
    	int ans[100000] = {1,0},size = 1,carry = 0;//定义并且初始化所有需要的值 
    	for(int i = 2;i <= n;i++)//从2到当前需要阶乘的值 
    	{
    		for(int j = 0;j < size;j++)//遍历所有已经有的值 
    		{
    			int temp = ans[j]*i + carry;//用已经有的每个值去乘数并且加上进位 
    			ans[j] = temp%10;//除去进位后的是当前位置上的数 
    			carry = temp/10;//用除以10 求得应该进多少位 
			}
			while(carry != 0)//只要进位的值不等于0 
			{
				ans[size++] = carry % 10;//最大值进位 
				carry /= 10; //进位后进位值变小 
			}
		}
		for(int i = size - 1;i >= 0;i--)//倒序遍历 
		{
			printf("%d",ans[i]);//输出数组里的每个值 
		}
    }
	return 0;//结束主函数 
} 











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