Skip to content

Instantly share code, notes, and snippets.

@RyuaNerin
Created May 14, 2014 02:48
Show Gist options
  • Save RyuaNerin/fbcea88a4ef98215afc4 to your computer and use it in GitHub Desktop.
Save RyuaNerin/fbcea88a4ef98215afc4 to your computer and use it in GitHub Desktop.
간단하게 만들어본 BitNumber Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RyuaNerin
{
public class BigNumber
{
public BigNumber()
: this("0")
{
}
public BigNumber(string value)
: this(NumToArray(value))
{
}
public BigNumber(int[] array)
{
this.arr = array;
}
internal int[] arr;
public string Value
{
get
{
return ArrayToNum(this.arr);
}
set
{
this.arr = NumToArray(value);
}
}
public string CutValue()
{
string v = this.Value;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < v.Length; ++i)
{
sb.Append(v[i]);
if ((i + 1) % 5 == 0)
sb.Append(' ');
if ((i + 1) % 100 == 0)
sb.Append('\n');
}
return sb.ToString();
}
//////////////////////////////////////////////////////////////////////////
// Static Functions
private static int[] NumToArray(string num)
{
int[] buff = new int[num.Length];
int index = 0;
int multip = 1;
for (int i = num.Length - 1; i >= 0; --i)
{
buff[index] += ((char)num[i] - '0') * multip;
multip *= 10;
if (multip >= 10000)
{
multip = 1;
index++;
}
}
return buff;
}
private static string ArrayToNum(int[] buff)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < buff.Length; i++)
sb.Insert(0, String.Format("{0:0000}", buff[i]));
while (sb.Length > 1 && sb[0] == '0')
sb.Remove(0, 1);
return sb.ToString();
}
public static BigNumber AddNumber(BigNumber num1, BigNumber num2)
{
return new BigNumber(AddNumber(num1.arr, num2.arr));
}
public static BigNumber SubNumber(BigNumber num1, BigNumber num2)
{
return new BigNumber(SubNumber(num1.arr, num2.arr));
}
public static BigNumber MultiNumber(BigNumber num1, BigNumber num2)
{
return new BigNumber(MultiNumber(num1.arr, num2.arr));
}
public static BigNumber MultiNumber(BigNumber num1, int num2)
{
return new BigNumber(MultiNumber(num1.arr, num2));
}
private static int[] CutInt(int[] num1)
{
int len = num1.Length;
while (len > 0)
{
if (num1[len - 1] > 0)
break;
len--;
}
if (len >= num1.Length - 20)
return num1;
int[] arr = new int[len];
for (int i = 0; i < len; ++i)
arr[i] = num1[i];
return arr;
}
private static int[] AddNumber(int[] num1, int[] num2)
{
int[] arr = new int[Math.Max(num1.Length, num2.Length)];
for (int i = 0; i < num1.Length; ++i)
{
if (i < num2.Length)
arr[i] += num1[i] + num2[i];
if (arr[i] >= 10000)
{
if (i + 1 >= num1.Length)
arr = ExpandArray(arr);
arr[i + 1]++;
arr[i] -= 10000;
}
}
return arr;
}
private static int[] SubNumber(int[] num1, int[] num2)
{
int[] arr = new int[Math.Max(num1.Length, num2.Length)];
for (int i = num1.Length - 1; i >= 0; --i)
{
arr[i] = num1[i] - num2[i];
if (arr[i] < 0)
{
arr[i + 1]--;
arr[i] += 10000;
}
}
return arr;
}
private static int[] MultiNumber(int[] num1, int[] num2)
{
int[] arr = new int[Math.Max(num1.Length, num2.Length)];
int[] arrm;
for (int i = 0; i < num1.Length && i < num2.Length; ++i)
{
if (num2[i] > 0)
{
arrm = MultiNumber(num1, ((num2[i] / 1) % 10) * 1);
arrm = Multi10000(arrm, i);
arr = AddNumber(arr, arrm);
}
if (num2[i] > 10)
{
arrm = MultiNumber(num1, ((num2[i] / 10) % 10) * 10);
arrm = Multi10000(arrm, i);
arr = AddNumber(arr, arrm);
}
if (num2[i] > 100)
{
arrm = MultiNumber(num1, ((num2[i] / 100) % 10) * 100);
arrm = Multi10000(arrm, i);
arr = AddNumber(arr, arrm);
}
if (num2[i] > 1000)
{
arrm = MultiNumber(num1, ((num2[i] / 1000) % 10) * 1000);
arrm = Multi10000(arrm, i);
arr = AddNumber(arr, arrm);
}
}
return CutInt(arr);
}
private static int[] MultiNumber(int[] num1, int num2)
{
int[] arr = new int[num1.Length];
for (int i = 0; i < num1.Length; ++i)
{
arr[i] += num1[i] * num2;
if (arr[i] > 10000)
{
if (i + 1 >= num1.Length)
arr = ExpandArray(arr);
arr[i + 1] += arr[i] / 10000;
arr[i] = arr[i] % 10000;
}
}
return arr;
}
private static int[] Multi10000(int[] num1, int num2)
{
if (num2 == 0)
return num1;
int[] arr = new int[num1.Length + 1];
int i;
for (i = 0; i < num2; ++i)
arr[i] = 0;
for (i = 0; i < num1.Length - num2; ++i)
arr[i + num2] = num1[i];
return arr;
}
private static int[] ExpandArray(int[] num)
{
int[] arr = new int[num.Length + 10000];
Buffer.BlockCopy(num, 0, arr, 0, num.Length * sizeof(int));
return arr;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment