无穷大加法.上万位数相加
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
using System;
using System.Collections.Generic;
using System.Text;
namespace temp
{
class Program
{
static void Main(string[] args)
{
string a = BigAddition("2545123654125874589656584552565468","3214569874566985521455688758966522322145587");
}
private static string BigAddition(string numberA, string numberB)
{
int groupTerm = 4;//默认4位
List<string> jieguo = GetresultList(numberA, numberB, groupTerm);
string ResultString = "";
for (int i = 0; i < jieguo.Count; i++)
{
ResultString += jieguo[jieguo.Count-1 - i];
}
return ResultString;
}
private static List<string> GetresultList(string numberA, string numberB, int groupTerm)
{
string[] numberAlist = listisok(numberA, groupTerm);
string[] numberBlist = listisok(numberB, groupTerm);
List<string> jieguo = jisuan(numberAlist, numberBlist);
List<string> zuihoujieguoji = new List<string>();
for (int i = 0; i < jieguo.Count; i++)
{
if (int.Parse(jieguo[i].ToString()) > groupTerm)
{
string fanzhunjieguo = Fanzhuan(jieguo[i].ToString());
string jieguo1;
string shengyujieguo = "0";
if (fanzhunjieguo.Length < groupTerm)
{
jieguo1 = Fanzhuan(fanzhunjieguo.Substring(0));
}
else
{
jieguo1 = Fanzhuan(fanzhunjieguo.Substring(0, groupTerm));
shengyujieguo = Fanzhuan(fanzhunjieguo.Substring(groupTerm));
if (shengyujieguo != null || shengyujieguo == "0")
{
jieguo[i + 1] = (int.Parse(jieguo[i + 1]) + int.Parse(shengyujieguo)).ToString();
}
}
zuihoujieguoji.Add(jieguo1);
}
}
return zuihoujieguoji;
}
//计算结果
private static List<string> jisuan(string[] numberAlist, string[] numberBlist)
{
List<string> jieguo = new List<string>();
if (numberAlist.Length > numberBlist.Length)
{
for (int i = 0; i < numberAlist.Length; i++)
{
if (i > numberBlist.Length - 1)
{
jieguo.Add(numberAlist[i].ToString());
}
else
{
int temp = int.Parse(numberAlist[i].ToString()) + int.Parse(numberBlist[i].ToString());
jieguo.Add(temp.ToString());
}
}
}
else
{
for (int i = 0; i < numberBlist.Length; i++)
{
if (i > numberAlist.Length - 1)
{
jieguo.Add(numberBlist[i].ToString());
}
else
{
int temp = int.Parse(numberAlist[i].ToString()) + int.Parse(numberBlist[i].ToString());
jieguo.Add(temp.ToString());
}
}
}
return jieguo;
}
private static string[] listisok(string numberA, int groupTerm)
{
string[] numberAlist = getnewlist(numberA, groupTerm);
int numberAgroup = group(numberA, groupTerm);
for (int i = 0; i < numberAlist.Length; i++)
{
numberAlist[i] = Fanzhuan(numberAlist[i].ToString());
}
return numberAlist;
}
private static string[] getnewlist(string number, int groupTerm)
{
//根据条件分组
int numberAgroup = group(number, groupTerm);//数字A分组个数
string[] grouplist = new string[numberAgroup];
//字符串反转
string lingshistring = Fanzhuan(number);
for (int i = 0; i < numberAgroup; i++)
{
if (i < numberAgroup - 1)
grouplist[i] = (lingshistring.Substring(i * groupTerm, groupTerm));
else grouplist[i] = lingshistring.Substring(i * groupTerm);
}
return grouplist;
}
private static string Fanzhuan(string number)
{
char[] fanzhuanzhunbei = number.ToCharArray();
Array.Reverse(fanzhuanzhunbei);//反转
string lingshistring = null;
for (int i = 0; i < fanzhuanzhunbei.Length; i++)
{
lingshistring += fanzhuanzhunbei[i];
}
return lingshistring;
}
private static int group(string number, int groupTerm) //对数字分组判断
{
int numbergroup;
if (number.Length % groupTerm == 0)
{
numbergroup = number.Length / groupTerm;
}
else numbergroup = number.Length / groupTerm + 1;
return numbergroup;
}
}
}
搞了2个小时.. 出来了.. 代码还能在优化.. 我只做出了结果.保证结果正确,还可以做乘法运算
例如
2545123654125874589656584552565468+
3214569874566985521455688758966522322145587=
3214569877112109175581563348623106874711055
2.
23521456856954789999559559523221112244558411222541225442222556688445852+
2544114556698778895545566321445877899654552333655211144455777855522111=
26065571413653568895105125844666990144212963556196436586678334543967963