免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 發帖

c++大數階層計算/large factorial

  1. #include<iostream>
  2. using namespace std;

  3. //目前極限是1142!(2998個位數)

  4. #define MAX 1000

  5. int multiply(int x, int res[], int res2[], int res3[], int res_size);

  6. void factorial(int n)
  7. {
  8.         int res[MAX],res2[MAX],res3[MAX];
  9.         string s;
  10.        
  11.         res[0] = 1;
  12.         int size = 1;

  13.         for (int x=2; x<=n; x++)
  14.                 size = multiply(x, res, res2, res3, size);
  15.         if(size>2000){
  16.                 for (int i=size-1-2000; i>=0; i--)
  17.                 s += res3[i]+'0';
  18.                 for (int i=2000-1-1000; i>=0; i--)
  19.                 s += res2[i]+'0';
  20.                 for (int i=1000-1; i>=0; i--)
  21.                 s += res[i]+'0';
  22.         }
  23.         if(size>1000 && size<=2000){
  24.                 for (int i=size-1-1000; i>=0; i--)
  25.                 cout << res2[i];
  26.                 for (int i=1000-1; i>=0; i--)
  27.                 cout << res[i];
  28.         }
  29.         if(size<=1000){
  30.                 for (int i=size-1; i>=0; i--)
  31.                 s += res[i]+'0';
  32.         }
  33.         cout << "size:" << size << endl;
  34.         cout << s << endl;
  35. }

  36. int multiply(int x, int res[], int res2[], int res3[], int res_size)
  37. {
  38.         int carry = 0;
  39.        
  40.         if(res_size<=1000){
  41.                 for (int i=0; i<res_size; i++)
  42.             {
  43.                 int prod = res[i] * x + carry;

  44.                 res[i] = prod % 10;   

  45.                 carry  = prod/10;     
  46.             }
  47.         }else if(res_size<2000){
  48.                 for (int i=0; i<1000; i++)
  49.             {
  50.                 int prod = res[i] * x + carry;

  51.                 res[i] = prod % 10;   

  52.                 carry  = prod/10;     
  53.                
  54.                    }
  55.                    for (int i=0; i<res_size-1000; i++)
  56.                 {                       
  57.                         int prod = res2[i] * x + carry;

  58.                         res2[i] = prod % 10;
  59.                                
  60.                         carry = prod/10;       
  61.                 }
  62.         }else{
  63.                 for (int i=0; i<1000; i++)
  64.                 {
  65.                         int prod = res[i] * x + carry;

  66.                         res[i] = prod % 10;
  67.        
  68.                         carry = prod/10;         
  69.                 }
  70.                 for (int i=0; i<1000; i++)
  71.                 {
  72.                         int prod = res2[i] * x + carry;

  73.                         res2[i] = prod % 10;
  74.        
  75.                         carry = prod/10;       
  76.                 }
  77.                 for (int i=0; i<res_size-2000; i++)
  78.                 {
  79.                         int prod = res3[i] * x + carry;

  80.                         res3[i] = prod % 10;
  81.        
  82.                         carry = prod/10;       
  83.                 }
  84.         }
  85.                 while (carry)
  86.                 {
  87.                         if(res_size<1000){
  88.                                 res[res_size] = carry%10;
  89.                                 carry = carry/10;
  90.                         }else if(res_size<2000){
  91.                                 res2[res_size-1000] = carry%10;
  92.                                 carry = carry/10;
  93.                         }else{
  94.                                 res3[res_size-2000] = carry%10;
  95.                                 carry = carry/10;
  96.                         }
  97.                         res_size++;
  98.                 }
  99.                 return res_size;
  100.        
  101. }

  102. int main()
  103. {
  104.         int a;
  105.         for(int i=0;i<10;i++){
  106.                 for(int j=0;j<10;j++){
  107.                         cout<<j;
  108.                 }
  109.         }
  110.         cout<<endl;
  111.         while(1){
  112.                 cin>>a;
  113.                 factorial(a);
  114.         }
  115.         return 0;
  116. }
複製代碼
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

小貓貓2017了喔!
(點一下康娜醬傳送到小貓貓2017大事記)

返回列表