Advertisement
Asenval

Untitled

Jan 27th, 2013
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Text;
  3.  
  4. class CalculateNFacturielwithDigitsInArray
  5. {
  6.     static void Main()
  7.     {
  8.         Console.WriteLine("Insert Number to calculate its facturial:");
  9.         string n = Console.ReadLine();
  10.         //n = MultiplyTwoNumbersByDigits("85", "135");
  11.         string facturiel = CalcFacturiel(n);
  12.         Console.WriteLine(facturiel);
  13.     }
  14.  
  15.     private static string CalcFacturiel(string n)
  16.     {        
  17.         if (n.Length == 1)
  18.         {
  19.             if (Convert.ToInt32(n) > 1)
  20.             {
  21.                 n = MultiplyTwoNumbersByDigits(n, CalcFacturiel(numberMinusOne(n)));
  22.             }
  23.         }
  24.         else
  25.         {
  26.             n = MultiplyTwoNumbersByDigits(n, CalcFacturiel(numberMinusOne(n)));
  27.         }
  28.         return n;
  29.     }
  30.     static string numberMinusOne(string n)
  31.     {
  32.         StringBuilder sb = new StringBuilder();
  33.         sb.Append(n);
  34.         int number;
  35.         int i = 1;
  36.         do
  37.         {
  38.             number = Convert.ToInt32(sb[sb.Length - i].ToString());
  39.  
  40.             if (number != 0)
  41.             {
  42.                 sb.Remove(sb.Length - i, 1);
  43.                 if (number - 1 != 0 || sb.Length >= i)
  44.                 {
  45.                   sb.Insert(sb.Length - i + 1, (number - 1));
  46.                 }
  47.             }
  48.             i++;
  49.         }
  50.         while (number == 0);
  51.         i--;
  52.         sb.Replace("0", "9", sb.Length + 1 - i, i -1);
  53.  
  54.         n = sb.ToString();
  55.         return n;
  56.     }
  57.  
  58.     static string MultiplyTwoNumbersByDigits(string firstNumber, string secondNumber)
  59.     {
  60.         int[] firstArray = new int[firstNumber.Length];
  61.         int[] secondArray = new int[secondNumber.Length];
  62.         int[] multiArray = new int[Math.Max(firstNumber.Length, secondNumber.Length) * 2];
  63.         int[] multiArrayCurrent = new int[multiArray.Length];
  64.         int[] multiArrayPrevious = new int[multiArray.Length];
  65.         StringBuilder Number = new StringBuilder();
  66.         Number.Append(firstNumber);
  67.         for (int i = 0; i < firstNumber.Length; i++)
  68.         {
  69.             firstArray[i] = Convert.ToInt32(Number[firstNumber.Length - 1 - i].ToString());
  70.         }
  71.         Number.Clear();
  72.         Number.Append(secondNumber);
  73.         for (int i = 0; i < secondNumber.Length; i++)
  74.         {
  75.             secondArray[i] = Convert.ToInt32(Number[secondNumber.Length - 1 - i].ToString());
  76.         }
  77.         Number.Clear();
  78.         for (int j = 0; j < firstNumber.Length; j++)
  79.         {
  80.             for (int i = 0; i <secondNumber.Length + 1; i++)
  81.             {
  82.                 if (i == 0)
  83.                 {
  84.                     multiArrayCurrent[i + j] = (firstArray[j] * secondArray[i]) % 10;
  85.                 }
  86.                 else if (i == Math.Max(firstNumber.Length, secondNumber.Length))
  87.                 {
  88.                     multiArrayCurrent[i + j] = (firstArray[j] * secondArray[i - 1]) / 10;
  89.                 }
  90.                 else
  91.                 {
  92.                     multiArrayCurrent[i + j] = (firstArray[j] * secondArray[i]) % 10 + (firstArray[j] * secondArray[i - 1]) / 10;
  93.                 }
  94.             }
  95.             int naum = 0;
  96.             for (int i = 0; i < multiArray.Length; i++)
  97.             {
  98.                 if (i == 0)
  99.                 {
  100.                     multiArray[i] = (multiArrayCurrent[i] + multiArrayPrevious[i]) % 10;
  101.                 }
  102.                 else if (i == multiArray.Length)
  103.                 {
  104.                     multiArray[i] = (multiArrayCurrent[i - 1] + multiArrayPrevious[i - 1]) / 10;
  105.                 }
  106.                 else
  107.                 {
  108.                     multiArray[i] = (multiArrayCurrent[i] + multiArrayPrevious[i]) % 10 + (multiArrayCurrent[i - 1] + multiArrayPrevious[i - 1]) / 10 +naum;
  109.                     naum = 0;
  110.                     if (multiArray[i] > 9)
  111.                     {
  112.                         naum = multiArray[i] / 10;
  113.                         multiArray[i] = multiArray[i] % 10;
  114.                     }
  115.                     }
  116.             }
  117.  
  118.             multiArray.CopyTo(multiArrayPrevious, 0);
  119.             Array.Clear(multiArrayCurrent,0,multiArrayCurrent.Length);
  120.  
  121.  
  122.         }
  123.         Array.Reverse(multiArray);
  124.         if (multiArray[0] != 0)
  125.         {
  126.             Number.Append(multiArray[0]);
  127.         }
  128.         bool isZero = false;
  129.         for (int i = 1; i < multiArray.Length; i++)
  130.         {
  131.             if (multiArray[i] != 0 || isZero)
  132.             {
  133.                 Number.Append(multiArray[i]);
  134.                 isZero = true;
  135.             }
  136.         }
  137.         return Number.ToString();
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement