View difference between Paste ID: irQBAkzj and SESFMbub
SHOW: | | - or go back to the newest paste.
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)
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
}