前言
在很多时候需要大整数的加减乘除,一下封装了大整数的方法
题目
代码
using System;
using System.Collections.Generic;
public class Program
{
public static void Main(string[] args)
{
string input = Console.ReadLine();
string[] val = input.Split(' ');
Console.WriteLine(StringMul(StringDiv(val[0],"2"),val[1]));
}
public static void RemoveZero(ref string a)
{
int start=0;
for(int i=0;i<a.Length;i++)
{
if(a[i]=='0')
{
start++;
}
else
{
break;
}
}
a = a.Substring(start);
}
public static int Comp(string a,string b)
{
RemoveZero(ref a);
RemoveZero(ref b);
if(a.Length>b.Length)
{
return 1;
}
else if(a.Length<b.Length)
{
return 2;
}
else
{
for(int i=0;i<a.Length;i++)
{
if(a[i]>b[i])
return 1;
else if(a[i]<b[i])
return 2;
}
return 0;
}
}
public static string StringAdd(string a, string b)
{
RemoveZero(ref a);
RemoveZero(ref b);
string result="";
int flag = 0;
if(a.Length<b.Length)
{
string temp = a;
a = b;
b = temp;
}
for(int i=1;i<=b.Length;i++)
{
int sum = b[b.Length-i] -'0' +a[a.Length-i]-'0' + flag;
if(sum>=10)
flag = 1;
else
flag = 0;
result = (char)(sum%10 + '0') + result;
}
for(int i=b.Length+1;i<=a.Length;i++)
{
int sum = a[a.Length-i]-'0'+flag;
if(sum>=10)
flag = 1;
else
flag = 0;
result = (char)(sum%10 + '0') + result;
}
if(flag ==1)
{
result ='1'+result;
}
RemoveZero(ref result);
return result;
}
public static string StringSub(string a,string b)
{
string result ="";
RemoveZero(ref a);
RemoveZero(ref b);
int flag =0;
int compRes = Comp(a,b);
if(compRes == 0)
result ="0";
else if(compRes == 1)
{
for(int i=1;i<=b.Length;i++)
{
int sub = a[a.Length-i]-b[b.Length-i]-flag;
if(sub>=0)
flag =0;
else
{
flag = 1;
sub = 10 + sub;
}
result = (char)(sub+'0') +result;
}
for(int i=b.Length+1;i<=a.Length;i++)
{
int sub = a[a.Length-i] -'0' -flag;
if(sub>=0)
flag =0;
else
{
flag = 1;
sub = 10 +sub;
}
result = (char)(sub+'0') +result;
}
}
else
{
for(int i=1;i<=a.Length;i++)
{
int sub = b[b.Length-i]-a[a.Length-i]-flag;
if(sub>=0)
flag =0;
else
{
flag = 1;
sub = 10 + sub;
}
result = (char)(sub+'0') +result;
}
for(int i=a.Length+1;i<=b.Length;i++)
{
int sub = b[b.Length-i] -'0' -flag;
if(sub>=0)
flag =0;
else
{
flag = 1;
sub = 10 +sub;
}
result = (char)(sub+'0') +result;
}
result = "-" + result;
}
RemoveZero(ref result);
return result;
}
public static string StringMul(string a,string b)
{
RemoveZero(ref a);
RemoveZero(ref b);
Dictionary<string,string> mulResult = new Dictionary<string, string>();
string result ="0";
string addNum ="0";
int compRes = Comp(a,b);
if(compRes==2)
{
string temp = a;
a=b;
b=temp;
}
mulResult.Add("1",a);
while(Comp(b,"0")!=0)
{
if(addNum == "0")
{
result = a;
addNum = "1";
b = StringSub(b,addNum);
}
else
{
if(Comp(b,addNum)==1 || Comp(b,addNum)==0)
{
result = StringAdd(result,result);
b = StringSub(b,addNum);
addNum =StringAdd(addNum,addNum);
mulResult.Add(addNum,result);
}
else
{
string cur ="1";
foreach (string item in mulResult.Keys)
{
int compRes2 = Comp(b,item);
if(compRes2 == 1 || compRes2 == 0)
{
if(Comp(item,cur)==1)
{
cur =item;
}
}
}
result = StringAdd(result,mulResult[cur]);
b = StringSub(b,cur);
}
}
}
return result;
}
public static string StringDiv(string a,string b)
{
RemoveZero(ref a);
RemoveZero(ref b);
Dictionary<string,string> mulResult = new Dictionary<string, string>();
string max ="1";
string result ="0";
mulResult.Add(max,b);
while(true)
{
string curMax = StringAdd(max,max);
string value =StringMul(b,curMax);
if(Comp(a,value)==2)
{
break;
}
mulResult.Add(curMax,value);
max = curMax;
}
while(Comp(a,b)==1 || Comp(a,b) == 0)
{
if(result =="0")
{
result =max;
a =StringSub(a,mulResult[max]);
}
else
{
string cur ="1";
foreach (string item in mulResult.Keys)
{
int compRes = Comp(a,mulResult[item]);
if(compRes ==1 || compRes ==0)
{
cur = item;
}
else
break;
}
a = StringSub(a,mulResult[cur]);
result = StringAdd(result,cur);
}
}
return result;
}
}