using System;
namespace CalcLastVersion
{
class BigNumber
{
private int[] arrIntNum;
private double[] arrDoubleNum;
private string num;
public BigNumber()
{
}
public BigNumber(string num)
{
this.num = num;
arrIntNum = new int[this.num.Length];
arrDoubleNum = new double[this.num.Length];
}
public static BigNumber operator *(BigNumber firstNum, BigNumber secondNum)
{
BigNumber result = new BigNumber();
firstNum.IntParse();
secondNum.IntParse();
result.arrIntNum = result.SolutionForMulti(firstNum, secondNum);
return result;
}
public static string operator +(BigNumber firstNum, int secondNum)
{
int[] result = new int[firstNum.arrIntNum.Length + 1];
string print = "";
for(int i = firstNum.arrIntNum.Length - 1; i >= 0; i--)
{
result[i + 1] = firstNum.arrIntNum[i];
}
result[result.Length - 1] += secondNum;
for (int i = result.Length - 1; i >= 0; i-- )
{
if (result[i] >= 10)
{
int temp = result[i];
result[i] %= 10;
result[i - 1] += temp / 10;
}
}
foreach (int item in result)
print += item + " ";
return print;
}
public static string operator /(BigNumber firstNum, double secondNum)
{
firstNum.DoubleParse();
return "";
}
private void IntParse()
{
long num;
if ((!long.TryParse(this.num, out num)) || (num <= 0))
throw new Exception("Bad input");
else
{
num = long.Parse(this.num);
int i = this.num.Length - 1;
while (num != 0)
{
arrIntNum[i] = (int)num % 10;
num /= 10;
i--;
}
}
}
private void DoubleParse()
{
double num;
if ((!double.TryParse(this.num, out num)) || (num <= 0))
throw new Exception("Bad input");
else
{
num = double.Parse(this.num);
int i = this.num.Length - 1;
while (num != 0)
{
arrDoubleNum[i] = num % 10;
num /= 10;
i--;
}
}
}
private int[] OneDigitMulti(BigNumber firstNum, BigNumber secondNum, int j, int cnt)
{
int resLen = firstNum.arrIntNum.Length + secondNum.arrIntNum.Length - 1;
int[] result = new int[firstNum.arrIntNum.Length + secondNum.arrIntNum.Length];
for (int i = firstNum.arrIntNum.Length - 1, k = 0; i >= 0; i--, k++)
{
int remOfDiv = 0;
int intPart = 0;
int temp = 0;
if ((secondNum.arrIntNum[j] * firstNum.arrIntNum[i]) > 9)
{
temp = secondNum.arrIntNum[j] * firstNum.arrIntNum[i];
remOfDiv = temp % 10;
intPart = temp / 10;
}
else
{
temp = secondNum.arrIntNum[j] * firstNum.arrIntNum[i];
remOfDiv = temp;
intPart = 0;
}
result[resLen - k - cnt] += remOfDiv;
result[resLen - k - (1 + cnt)] += intPart;
if (result[resLen - k - cnt] > 9)
{
result[resLen - k - (1 + cnt)] += result[resLen - k - cnt] / 10;
result[resLen - k - cnt] %= 10;
}
}
return result;
}
private int[] SumArrays(int[] firstArr, int[] secondArr)
{
int[] result = new int[firstArr.Length];
for (int i = result.Length - 1; i >= 0; i--)
{
result[i] += firstArr[i] + secondArr[i];
if (result[i] >= 10)
{
int temp = result[i] % 10;
result[i - 1] = result[i - 1] + (result[i] / 10);
result[i] = temp;
}
}
return result;
}
private int[] SolutionForMulti(BigNumber firstNum, BigNumber secondNum)
{
int cnt = 0;
int[] resSum = new int[firstNum.arrIntNum.Length + secondNum.arrIntNum.Length];
int[] resVal = new int[firstNum.arrIntNum.Length + secondNum.arrIntNum.Length];
for (int i = secondNum.arrIntNum.Length - 1; i >= 0; i--)
{
resSum = SumArrays(resSum, resVal);
resVal = OneDigitMulti(firstNum, secondNum, i, cnt);
cnt++;
}
resSum = SumArrays(resSum, resVal);
return resSum;
}
private string Division(BigNumber firstNum, double secondNum)
{
string result = "";
int[] temp = new int[firstNum.arrDoubleNum.Length];
for (int i = 0; i < firstNum.arrDoubleNum.Length; i++)
{
if((firstNum.arrDoubleNum[i] / secondNum) != 0)
{
}
}
return result;
}
}
}