using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//сделать сложение очень больших чисел, которые не влезают в long и int64, заходят как строка, при этом должны быть следующие ограничения:
//+не отрицательное число
//+в аргументе только цифры
//+нет ведущих нолей
//+не пустая строка
//+целое
//нужно создать класс bignumber и 3 его метода:
//+конструктор с ограничениями выше
//+метод сложения двух объектов(через перегрузку операторов)
//+и перекрыть метод tostring()
namespace Sum
{
class Program
{
static void Main(string[] args)
{
BigNumber a = new BigNumber("175872");
BigNumber b = new BigNumber("1234567890123456789012345678901234567890");
//BigNumber a = new BigNumber("19");
//BigNumber b = new BigNumber("2");
Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());
var r = a + b;
Console.WriteLine(r.ToString());
Console.ReadKey();
}
}
public class BigNumber
{
string bignumber;
/// <summary>
/// Конструктор класса
/// </summary>
public BigNumber(string bignum)
{
if (bignum.Length == 0)
{
Console.WriteLine("Тип вводимых данных не соответсвует требованиям");
bignumber = null;
return;
}
else
{
int x1;
int x2 = 0;
int i = 0;
foreach (var number in bignum)
{
try
{
x1 = (int)Char.GetNumericValue(number);
x2 += x1;
bignumber = bignum;
}
catch (Exception)
{
Console.WriteLine("Тип вводимых данных не соответсвует требованиям");
bignumber = null;
break;
}
if (bignum.Length != 1 && x2 == 0 && i != 0)
{
Console.WriteLine("Тип вводимых данных не соответсвует требованиям");
bignumber = null;
break;
}
i += 1;
}
}
}
/// <summary>
/// Сложение
/// </summary>
/// <returns>ответ</returns>
public static BigNumber operator + (BigNumber a, BigNumber b)
{
int[] a_array, b_array, c_array;
a_array = new int[a.bignumber.Length];
b_array = new int[b.bignumber.Length];
int i = 0;
foreach (var item in a.bignumber)
{
a_array[i] = (int)Char.GetNumericValue(item);
i += 1;
}
int j = 0;
foreach (var item in b.bignumber)
{
b_array[j] = (int)Char.GetNumericValue(item);
j += 1;
}
Array.Reverse(a_array);
Array.Reverse(b_array);
int temp = 0;
if (a.bignumber.Length >= b.bignumber.Length)
{
c_array = new int[a.bignumber.Length];
for (int n = 0; n < a.bignumber.Length; n++)
{
if ((n+1) <= b.bignumber.Length)
{
if (n < a.bignumber.Length-1)
{
c_array[n] = (a_array[n] + b_array[n] + temp) % 10;
temp = (a_array[n] + b_array[n] + temp) / 10;
}
else
{
c_array[n] = a_array[n] + b_array[n] + temp;
}
}
else
{
if (n < a.bignumber.Length - 1)
{
c_array[n] = (a_array[n] + temp) % 10;
temp = (a_array[n] + temp) / 10;
}
else
{
c_array[n] = a_array[n] + temp;
}
}
}
}
else
{
c_array = new int[b.bignumber.Length];
for (int n = 0; n < b.bignumber.Length; n++)
{
if ((n + 1) <= a.bignumber.Length)
{
if (n < b.bignumber.Length - 1)
{
c_array[n] = (a_array[n] + b_array[n] + temp) % 10;
temp = (a_array[n] + b_array[n] + temp) / 10;
}
else
{
c_array[n] = a_array[n] + b_array[n] + temp;
}
}
else
{
if (n < b.bignumber.Length - 1)
{
c_array[n] = (b_array[n] + temp) % 10;
temp = (b_array[n] + temp) / 10;
}
else
{
c_array[n] = b_array[n] + temp;
}
}
}
}
Array.Reverse(c_array);
string res = String.Concat<int>(c_array);
BigNumber res1 = new BigNumber(res);
return res1;
}
public override string ToString()
{
return bignumber;
}
}
}