c++大數階層計算/large factorial
- #include<iostream>
- using namespace std;
- //目前極限是1142!(2998個位數)
- #define MAX 1000
- int multiply(int x, int res[], int res2[], int res3[], int res_size);
- void factorial(int n)
- {
- int res[MAX],res2[MAX],res3[MAX];
- string s;
-
- res[0] = 1;
- int size = 1;
-
- for (int x=2; x<=n; x++)
- size = multiply(x, res, res2, res3, size);
- if(size>2000){
- for (int i=size-1-2000; i>=0; i--)
- s += res3[i]+'0';
- for (int i=2000-1-1000; i>=0; i--)
- s += res2[i]+'0';
- for (int i=1000-1; i>=0; i--)
- s += res[i]+'0';
- }
- if(size>1000 && size<=2000){
- for (int i=size-1-1000; i>=0; i--)
- cout << res2[i];
- for (int i=1000-1; i>=0; i--)
- cout << res[i];
- }
- if(size<=1000){
- for (int i=size-1; i>=0; i--)
- s += res[i]+'0';
- }
- cout << "size:" << size << endl;
- cout << s << endl;
- }
- int multiply(int x, int res[], int res2[], int res3[], int res_size)
- {
- int carry = 0;
-
- if(res_size<=1000){
- for (int i=0; i<res_size; i++)
- {
- int prod = res[i] * x + carry;
-
- res[i] = prod % 10;
- carry = prod/10;
- }
- }else if(res_size<2000){
- for (int i=0; i<1000; i++)
- {
- int prod = res[i] * x + carry;
-
- res[i] = prod % 10;
-
- carry = prod/10;
-
- }
- for (int i=0; i<res_size-1000; i++)
- {
- int prod = res2[i] * x + carry;
- res2[i] = prod % 10;
-
- carry = prod/10;
- }
- }else{
- for (int i=0; i<1000; i++)
- {
- int prod = res[i] * x + carry;
- res[i] = prod % 10;
-
- carry = prod/10;
- }
- for (int i=0; i<1000; i++)
- {
- int prod = res2[i] * x + carry;
- res2[i] = prod % 10;
-
- carry = prod/10;
- }
- for (int i=0; i<res_size-2000; i++)
- {
- int prod = res3[i] * x + carry;
- res3[i] = prod % 10;
-
- carry = prod/10;
- }
- }
- while (carry)
- {
- if(res_size<1000){
- res[res_size] = carry%10;
- carry = carry/10;
- }else if(res_size<2000){
- res2[res_size-1000] = carry%10;
- carry = carry/10;
- }else{
- res3[res_size-2000] = carry%10;
- carry = carry/10;
- }
- res_size++;
- }
- return res_size;
-
- }
- int main()
- {
- int a;
- for(int i=0;i<10;i++){
- for(int j=0;j<10;j++){
- cout<<j;
- }
- }
- cout<<endl;
- while(1){
- cin>>a;
- factorial(a);
- }
- return 0;
- }
複製代碼 |