筆記試験問題:Nの階乗を計算する



  
  
  
  
  1.  
  2. public class test   
  3. {  
  4.     // ,  
  5.     private static String multipy(String num1, String num2)  
  6.     {//  
  7.         String result = "0";  
  8.         int i,j,n1,n2;  
  9.         int len1 = num1.length();  
  10.         int len2 = num2.length();  
  11.         if (len1 < len2)  
  12.         {  
  13.             for (i = len1 -1; i >=0; --i)  
  14.             {  
  15.                 n1 = num1.charAt(i) - '0';  
  16.                 String sum = "0";  
  17.                 for (j = 0; j < n1; ++j)  
  18.                 {  
  19.                     sum = add(sum,num2);  
  20.                 }  
  21.                 StringBuilder tmpSB = new StringBuilder(sum);  
  22.                 for (j = i; j < len1 -1; ++j)  
  23.                 {  
  24.                     tmpSB.append("0");  
  25.                 }  
  26.                 result = add(result,tmpSB.toString());  
  27.             }  
  28.         }  
  29.         else 
  30.         {  
  31.             for (i = len2 -1; i >=0; --i)  
  32.             {  
  33.                 n2 = num2.charAt(i) - '0';  
  34.                 String sum = "0";  
  35.                 for (j = 0; j < n2; ++j)  
  36.                 {  
  37.                     sum = add(sum,num1);  
  38.                 }  
  39.                 StringBuilder tmpSB = new StringBuilder(sum);  
  40.                 for (j = i; j < len2 -1; ++j)  
  41.                 {  
  42.                     tmpSB.append("0");  
  43.                 }  
  44.                 result = add(result,tmpSB.toString());  
  45.             }  
  46.         }  
  47.  
  48.         return result;  
  49.     }  
  50.     private static String add(String num1, String num2)  
  51.     {//  
  52.         String result = "";  
  53.         int len1 = num1.length();  
  54.         int len2 = num2.length();  
  55.         int nAddOn = 0;//  
  56.         int i,j,n1,n2,sum;  
  57.         StringBuilder sb = new StringBuilder();  
  58.         for (i = len1 - 1,j = len2 - 1 ; i >= 0 && j >= 0; --i,--j)  
  59.         {  
  60.             n1 = num1.charAt(i) - '0';  
  61.             n2 = num2.charAt(j) - '0';  
  62.             sum = n1 + n2 + nAddOn;  
  63.               
  64.             if (sum >= 10)  
  65.             {  
  66.                 nAddOn = 1;  
  67.             }  
  68.             else 
  69.             {  
  70.                 nAddOn = 0;  
  71.             }  
  72.             sb.append(sum % 10);  
  73.         }  
  74.         if (len1 > len2)  
  75.         {//  
  76.             for (; i >= 0; --i)  
  77.             {  
  78.                 n1 = num1.charAt(i) - '0';  
  79.                 sum = n1 + nAddOn;  
  80.                 if (sum >= 10)  
  81.                 {  
  82.                     nAddOn = 1;  
  83.                 }  
  84.                 else 
  85.                 {  
  86.                     nAddOn = 0;  
  87.                 }  
  88.                 sb.append(sum % 10);  
  89.             }  
  90.         }  
  91.         else if (len2 > len1)  
  92.         {//  
  93.             for (; j >= 0; --j)  
  94.             {  
  95.                 n2 = num2.charAt(j) - '0';  
  96.                 sum = n2 + nAddOn;  
  97.                 if (sum >= 10)  
  98.                 {  
  99.                     nAddOn = 1;  
  100.                 }  
  101.                 else 
  102.                 {  
  103.                     nAddOn = 0;  
  104.                 }  
  105.                 sb.append(sum % 10);  
  106.             }  
  107.         }  
  108.           
  109.         if (nAddOn > 0)  
  110.         {  
  111.             sb.append(nAddOn);  
  112.         }  
  113.           
  114.         sb.reverse();  
  115.         result = sb.toString();  
  116.         return result;  
  117.     }  
  118.     private static String factorial(int n)  
  119.     {  
  120.         String result = "1";  
  121.         for (int i = n; i >= 2; --i)  
  122.         {  
  123.             result = multipy(result,String.valueOf(i));  
  124.         }  
  125.         return result;  
  126.     }  
  127.     public static void main(String[] args) throws Exception  
  128.     {  
  129.         // 100 !  
  130.         System.out.println(factorial(100));  
  131.     }  
  132.  

もう一つのc++版を比較します

  
  
  
  
  1. // ,  
  2.  
  3. #include <iostream>  
  4. #include <vector>  
  5. #include <algorithm>  
  6. using namespace std;  
  7.  
  8. string add(string num1, string num2)  
  9. {//  
  10.     string result = "";  
  11.     int len1 = num1.length();  
  12.     int len2 = num2.length();  
  13.     int nAddOn = 0;//  
  14.     int i,j,n1,n2,sum;  
  15.     vector<char> tmpSum;  
  16.  
  17.     for (i = len1 - 1,j = len2 - 1 ; i >= 0 && j >= 0; --i,--j)  
  18.     {  
  19.         n1 = num1[i] - '0';  
  20.         n2 = num2[j] - '0';  
  21.         sum = n1 + n2 + nAddOn;  
  22.  
  23.         if (sum >= 10)  
  24.         {  
  25.             nAddOn = 1;  
  26.         }  
  27.         else 
  28.         {  
  29.             nAddOn = 0;  
  30.         }  
  31.         tmpSum.push_back(sum % 10 + '0');  
  32.     }  
  33.     if (len1 > len2)  
  34.     {//  
  35.         for (; i >= 0; --i)  
  36.         {  
  37.             n1 = num1[i] - '0';  
  38.             sum = n1 + nAddOn;  
  39.             if (sum >= 10)  
  40.             {  
  41.                 nAddOn = 1;  
  42.             }  
  43.             else 
  44.             {  
  45.                 nAddOn = 0;  
  46.             }  
  47.             tmpSum.push_back(sum % 10 + '0');  
  48.         }  
  49.     }  
  50.     else if (len2 > len1)  
  51.     {//  
  52.         for (; j >= 0; --j)  
  53.         {  
  54.             n2 = num2[j] - '0';  
  55.             sum = n2 + nAddOn;  
  56.             if (sum >= 10)  
  57.             {  
  58.                 nAddOn = 1;  
  59.             }  
  60.             else 
  61.             {  
  62.                 nAddOn = 0;  
  63.             }  
  64.             tmpSum.push_back(sum % 10 + '0');  
  65.         }  
  66.     }  
  67.  
  68.     if (nAddOn > 0)  
  69.     {  
  70.         tmpSum.push_back(nAddOn + '0');  
  71.     }  
  72.     reverse(tmpSum.begin(),tmpSum.end());  
  73.     copy(tmpSum.begin(),tmpSum.end(),back_inserter(result));  
  74.     return result;  
  75. }  
  76.  
  77. string multipy(string num1, string num2)  
  78. {//  
  79.     string result = "0";  
  80.     int i,j,n1,n2;  
  81.     int len1 = num1.length();  
  82.     int len2 = num2.length();  
  83.     if (len1 < len2)  
  84.     {  
  85.         for (i = len1 -1; i >=0; --i)  
  86.         {  
  87.             n1 = num1[i] - '0';  
  88.             string sum = "0";  
  89.             for (j = 0; j < n1; ++j)  
  90.             {  
  91.                 sum = add(sum,num2);  
  92.             }  
  93.  
  94.             string tmpSB(sum);  
  95.             for (j = i; j < len1 -1; ++j)  
  96.             {  
  97.                 tmpSB.append("0");  
  98.             }  
  99.             result = add(result,tmpSB);  
  100.         }  
  101.     }  
  102.     else 
  103.     {  
  104.         for (i = len2 -1; i >=0; --i)  
  105.         {  
  106.             n2 = num2[i] - '0';  
  107.             string sum = "0";  
  108.             for (j = 0; j < n2; ++j)  
  109.             {  
  110.                 sum = add(sum,num1);  
  111.             }  
  112.             string tmpSB(sum);  
  113.             for (j = i; j < len2 -1; ++j)  
  114.             {  
  115.                 tmpSB.append("0");  
  116.             }  
  117.             result = add(result,tmpSB);  
  118.         }  
  119.     }  
  120.  
  121.     return result;  
  122. }  
  123.  
  124.  
  125. string factorial(int n)  
  126. {  
  127.     string result = "1";  
  128.     char buff[100];  
  129.     for (int i = n; i >= 2; --i)  
  130.     {  
  131.         result = multipy(result,_itoa(i, buff,10));  
  132.     }  
  133.     return result;  
  134. }  
  135.  
  136. int main()  
  137. {  
  138.     int N;  
  139.     while (cin >> N)  
  140.     {  
  141.         cout << factorial(N).c_str() << endl;  
  142.     }  
  143.     return 0;