using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
class Program
{
public static string Fanzhuan(string c) //倒序排列字符串
{
string Desvery = "";
for (int i = c.Length - 1; i >= 0; i--)
{
Desvery += c[i].ToString();
}
return Desvery;
}
![]()
![]()
public static string BNum(string d)
{
![]()
if (d.Length > 18) //判断所输入的字符串是否大于18
{
string Desvery=Program.Fanzhuan(d); //大于的话,先进行数据反转
string Mid = Desvery.Substring(0,18); //截取开始的18字符,也就是所谓的最低的位数,在计算加法的时候,一般都是从最后面的个位数,开始加起
Desvery = Desvery.Remove(0, 18);
while (Desvery.Length > 18)
{
Mid += ";" + Desvery.Substring(0, 18);
Desvery = Desvery.Remove(0, 18);
}
![]()
Mid += ";" + Desvery.Substring(0, Desvery.Length);
return Mid; //返回一个以 ";"为分隔符的字符串,每18位数字分割一次
![]()
![]()
}
else
{
return d; //小于18位数,则不需要截取 ,可以直接计算,因为long的最大数字是 9,223,372,036,854,775,807 |||||一个19位数,如果小于18位数进行加,数字是不会溢出的
}
}
![]()
![]()
![]()
public string Sum(string Num1,string Num2) // 计算
{
string a= BNum(Num1); //获得一个经过筛选或者改变 的字符串
string b = BNum(Num2);
string JieGuo = ""; //用于返回的一个字符串
if (a.IndexOf(';') == -1 && b.IndexOf(';') == -1) //如果没有发现 ";"则说明可以直接进行计算
{
long d = long.Parse(a) + long.Parse(b);
JieGuo = d.ToString();
![]()
}
else if(a.IndexOf(';')==-1 && b.IndexOf(';')!=-1) //如果一个是超大数字,一个不是 ,则进行下面的操作
{
string[] Number= b.Split(';'); //将超大的字符串分割为数组
![]()
for (int d = 0; d < Number.Length; d++)
{
Number[d] = Program.Fanzhuan(Number[d]); //第一次调用BNum()的时候,进行了一次反向排序,例如开始是(123)反向则是(321),用于计算的必须的原来的值,所以这里要换回原来的值
}
![]()
long k=long.Parse(Number[0]) + long.Parse(a); //计算 (a小于18位 所以没有进行任何操作,直接计算)
![]()
if(k.ToString().Length>18) //如果相加的和大于18位,则说明要向前面 进一 ( 例如 两个两位数相加 27+98=125 125是一个三位数大于两位数)
{
long zzz=long.Parse(Number[1])+1; //进一位
Number[1]=zzz.ToString();
Number[0] = k.ToString().Substring(1,18); //舍去进的一,支取后面18位
for(int i=Number.Length-1;i>=0;i--)
{
JieGuo+=Number[i]; //返回结果
}
}else
{
Number[0] = k.ToString(); //否则 不用进一 直接考虑加就可以了
for (int i = Number.Length - 1; i >= 0; i--)
{
JieGuo += Number[i];//返回结果
}
}
}
else if (b.IndexOf(';') == -1 && a.IndexOf(';')!=-1) //同上
{
![]()
string[] Number1 = a.Split(';');
for (int d = 0; d < Number1.Length; d++)
{
Number1[d] = Program.Fanzhuan(Number1[d]);
}
![]()
long k= long.Parse(Number1[0]) + long.Parse(b);
![]()
if(k.ToString().Length>18)
{
long zzz=long.Parse(Number1[1])+1;
Number1[1]=zzz.ToString();
Number1[0] = k.ToString().Substring(1, 18);
![]()
for (int i = Number1.Length - 1; i >= 0; i--)
{
JieGuo += Number1[i];
}
// return JieGuo;
}
else
{
Number1[0] = k.ToString();
for (int i = Number1.Length - 1; i >= 0; i--)
{
JieGuo += Number1[i];
}
// return JieGuo;
}
![]()
}
else if (b.IndexOf(';') != -1 && a.IndexOf(';') != -1) //如果两个都是庞大的数字
{
string[] Number2 = a.Split(';');
string[] Number3 = b.Split(';');
![]()
![]()
for (int d = 0; d < Number2.Length; d++)
{
Number2[d] = Program.Fanzhuan(Number2[d]);
}
![]()
for (int d = 0; d < Number3.Length; d++)
{
Number3[d] = Program.Fanzhuan(Number3[d]);
}
![]()
if(Number2.Length>Number3.Length) //第一个大于第二个数字
{
![]()
String[] Ax = new string[Number2.Length]; //新建一个数组
for (int i = 0; i < Number3.Length; i++) //(考虑到数组越界的情况,一定用长度小的那个作为遍历的条件)
{
![]()
long k= long.Parse(Number2[i]) + long.Parse(Number3[i]);
![]()
![]()
if (i > 0) //从第二次开始要计算是否要进 一
{
if (Ax[i - 1].Length > 18) //如果前面的数字之和大于18位 ,则进 一
{
Ax[i - 1] = Ax[i - 1].Substring(1, 18); // 并且改变上一个的长度
long ck = k + 1;
Ax[i] = ck.ToString();
}
else
{
Ax[i] = k.ToString();
}
}
else
{
Ax[i] = k.ToString(); //第一次的值就存入数组
}
![]()
if (i == Number3.Length - 1)
{
for (int s = i+1; s < Number2.Length; s++) //将多出来的数字 ,即高位数字,直接添加到数组当中
{
Ax[s] = Number2[s];
}
}
![]()
}
for(int i=0;i<Ax.Length;i++)
{
JieGuo += Ax[i]; //返回结果
}
![]()
}
else if (Number2.Length < Number3.Length) //同上
{
String[] Ax = new string[Number3.Length];
for (int i = 0; i < Number2.Length; i++)
{
![]()
long k = long.Parse(Number2[i]) + long.Parse(Number3[i]);
![]()
![]()
// Ax[i] = k.ToString();
if (i > 0)
{
if (Ax[i - 1].Length > 18)
{
Ax[i - 1] = Ax[i - 1].Substring(1, 18);
long ck = k + 1;
Ax[i] = ck.ToString();
}
else
{
Ax[i] = k.ToString();
}
}
else
{
Ax[i] = k.ToString();
}
![]()
if (i == Number2.Length - 1)
{
for (int s = i + 1; s < Number3.Length; s++)
{
Ax[s] = Number3[s];
}
}
![]()
}
for (int i = 0; i < Ax.Length; i++)
{
JieGuo += Ax[i];
}
}
else //基本同上 ,有一点小的区别
{
String[] Ax = new string[Number3.Length];
for (int i = 0; i < Number2.Length; i++)
{
long k = long.Parse(Number2[i]) + long.Parse(Number3[i]);
![]()
if (i > 0)
{
if (Ax[i - 1].Length > 18)
{
Ax[i - 1] = Ax[i - 1].Substring(1, 18);
long ck = k + 1;
Ax[i] = ck.ToString();
}
else
{
Ax[i] = k.ToString();
}
}
else
{
Ax[i] = k.ToString();
}
![]()
}
for (int i = Ax.Length-1; i >=0; i--)
{
JieGuo += Ax[i];
}
}
![]()
}
return JieGuo;
}
static void Main(string[] args)
{
![]()
Program a = new Program();
Console.Write("输入第一个数字:");
string c = Console.ReadLine();
Console.Write("输入第二个数字:");
string d = Console.ReadLine();
Console.WriteLine("输入第三个数字:" + a.Sum(c, d));
Console.ReadLine();
}
}
}
![]()
![]()
posted @
2007-06-26 09:41
lijun
阅读(
662)
评论()
收藏
举报