大数的阶乘

        其实就只是10000以内的数的阶乘。一开始想到了用数组辅助的方法(因为50的阶乘就超过了long long int了),然而是我太年轻呀,20000位的数组都没表示完,最后换了a[200001],20万的数组过了。太可怕了

#include<iostream>
#include<string>
#include <algorithm>

using std::endl;
using std::cin;
using std::cout;

int main()
{
//大数的阶乘	
	int num, digit = 1, a[200001];                    //digit代表值有多少位 
	cin >> num;
	a[0] = 1;
	for (int i = 2; i <= num; i++) {                  
		int c = 0;                                    //c代表的是进位              
		for (int j = 0; j < digit; j++) {             // 保证从a[0]到a[digit-1],是之前赋值过的
			int temp = a[j] * i + c;
			a[j] = temp % 10;
			c = temp / 10;
		}
		while (c != 0) {
			a[digit] = c % 10;                     
			c = c / 10;
			digit++;                    
		}
	}
	for (int i = digit - 1; i >= 0; i--) {
		cout << a[i];
	}
}

        没啥思想在里面,就是竖式乘法。注意:每次乘完后可能不止进位1位(100×99!时),也可能不进位(3×2!时)。

                                     i
     ×  a[digit-1]a[digit-2]...a[1]a[0]
 ________________________________________
                               * * * *
                         * * * * * *
               * * * * * * * * *        
 ————————————————————————————————————————
 a[digit]a[digit-1]a[digit-2]...a[1]a[0]
posted on 2021-06-09 22:29  雾恋过往  阅读(121)  评论(0编辑  收藏  举报

Live2D