针对整数相乘的溢出问题
/// <summary>
/// 大数乘法/// </summary>
/// <param name="num1">乘数1</param>
/// <param name="num2">乘数2</param>
/// <returns></returns>
public string Multiply(string num1, string num2)
{
//拆分
char[] c1 = getChar(num1);
char[] c2 = getChar(num2);
//创建矩阵
int[,] matrix = getMatrix(c1, c2);
int[] plus = getTheSameRank(matrix);
//相加
string result = getResult(plus);
return result;
}
//拆分数字字符串为字符数组
private char[] getChar(string num)
{
return num.ToCharArray();
}
//依据拆分的字符数组创建矩阵
private int[,] getMatrix(char[] num1, char[] num2)
{
int[,] matrix = new int[num1.Length, num2.Length];//创建矩阵
for (int i = 0; i < num1.Length; i++)
{
for (int j = 0; j < num2.Length; j++)
{
matrix[i, j] = Convert.ToInt32(num1[i].ToString()) * Convert.ToInt32(num2[j].ToString());
}
}
return matrix;
}
//获取待相加数组
private int[] getTheSameRank(int[,] matrix)
{
//相同的秩,上一行、右一行
int rows = matrix.GetLength(0);
int column = matrix.GetLength(1);
int[] plus = new int[rows + column - 1];
//最后一行
//最后一行,从colum-1,1
for (int i = column - 1; i >= 1; i--)
{
int intBase = matrix[rows - 1, i];
//判断有一侧与上一行是否越界
int r = i;
int u = rows - 1;
while (r + 1 < column && u - 1 >= 0)
{
u = u - 1;
r = r + 1;
intBase += matrix[u, r];
}
plus[rows - 1 + i] = intBase;
}
//第一列,从rows-1,0
for (int i = rows - 1; i >= 0; i--)
{
int intBase = matrix[i, 0];
//判断有一侧与上一行是否越界
int r = 0;
int u = i;
while (r + 1 < column && u - 1 >= 0)
{
u = u - 1;
r = r + 1;
intBase += matrix[u, r];
}
plus[i] = intBase;
}
return plus;
}
//相加,读取每个数最后一个放入字符串 然后剩余的留作待相加
private string getResult(int[] ints)
{
string result = "";
int temp = 0;
for (int i = ints.Length - 1; i >= 0; i--)
{
int v = Convert.ToInt32(ints[i]) + temp;
result = v.ToString().Substring(v.ToString().Length - 1, 1) + result;
string vs = v.ToString();
if (vs.Length - 1 > 0)
{
temp = Convert.ToInt32(vs.Substring(0, vs.Length - 1));
}
else
{
temp = 0;
}
}
return result;
}