using System;
namespace Test
{
class Calc
{
private string firstNum;
private string secondNum;
private int[] arrFirstNum;
private int[] arrSecondNum;
private int[] result;
private int[,] resArr;
private int maxLenOfNum;
private int minLenOfNum;
public Calc(string fstNum, string scndNum)
{
firstNum = fstNum;
secondNum = scndNum;
arrFirstNum = new int[firstNum.Length];
arrSecondNum = new int[secondNum.Length];
LenCalc();
resArr = new int[minLenOfNum, firstNum.Length + secondNum.Length];
result = new int[firstNum.Length + secondNum.Length];
}
public bool CheckInput()
{
long check;
if ((!long.TryParse(firstNum, out check)) || (check <= 0) || (!long.TryParse(secondNum, out check)) || (check <= 0))
return false;
else
return true;
}
public void Sum()
{
int maxIndResArr = (firstNum.Length + secondNum.Length) - 1;
for (int i = maxIndResArr, k = 1; i >= 0; i--, k++)
{
for (int j = 0; j < minLenOfNum; j++)
result[i] += resArr[j, i];
if (result[i] >= 10)
{
int temp = result[i] % 10;
result[maxIndResArr - k] = result[maxIndResArr - k] + (result[i] / 10);
result[i] = temp;
}
}
}
public void Multiplication()
{
int maxIndResArr = (firstNum.Length + secondNum.Length) - 1;
int remOfDiv = 0;
int intPart = 0;
int lastDigitOfFirstNum = arrFirstNum.Length - 1;
for (int i = 0; i <= minLenOfNum - 1; i++)
{
int lastDigitOfSecondNum = arrSecondNum.Length - 1;
for (int j = maxIndResArr - i; j >= minLenOfNum - i; j--)
{
RemainderForMulti(out remOfDiv, out intPart, lastDigitOfFirstNum, lastDigitOfSecondNum);
resArr[i, j] += remOfDiv;
resArr[i, j - 1] += intPart;
remOfDiv = 0;
intPart = 0;
if (resArr[i, j] >= 10)
{
resArr[i, j - 1] += resArr[i, j] / 10;
resArr[i, j] %= 10;
}
lastDigitOfSecondNum--;
}
lastDigitOfFirstNum--;
}
}
public void RemainderForMulti(out int remOfDiv, out int intPart, int i, int j)
{
int temp = arrFirstNum[i] * arrSecondNum[j];
if (temp >= 10)
{
remOfDiv = temp % 10;
intPart = temp / 10;
}
else
{
remOfDiv = temp;
intPart = 0;
}
}
public void FillArrs()
{
if (long.Parse(firstNum) <= long.Parse(secondNum))
{
arrFirstNum = SplitByDigits(firstNum);
arrSecondNum = SplitByDigits(secondNum);
}
else
{
arrFirstNum = SplitByDigits(secondNum);
arrSecondNum = SplitByDigits(firstNum);
}
}
public void LenCalc()
{
if (firstNum.Length >= secondNum.Length)
{
maxLenOfNum = firstNum.Length;
minLenOfNum = secondNum.Length;
}
else
{
maxLenOfNum = secondNum.Length;
minLenOfNum = firstNum.Length;
}
}
public int[] SplitByDigits(string str)
{
int[] arr = new int[str.Length];
long num = long.Parse(str);
int i = str.Length - 1;
while (num != 0)
{
arr[i] = (int)num % 10;
num /= 10;
i--;
}
return arr;
}
public string Print2DArray()
{
int N = firstNum.Length + secondNum.Length;
string print = "";
for (int i = 0; i < minLenOfNum; i++)
{
for (int j = 0; j < N - i; j++)
print += resArr[i, j] + " ";
print += Environment.NewLine;
}
return print;
}
public string PrintArray()
{
string print = "";
foreach (int item in result)
print += item + " ";
return print;
}
}
}