大数相乘(1)见此。
其中大数相乘(2)与大数相乘(1)中的思路相同,存储结构也类似,些许不同为存储时空间采用的是len1 * len2,比上面的(len1 + len2) * len2要小。因为最近学C#,所以重写了一下。
using System;
using System.Collections.Generic;
namespace mytest_csharp
{
class logenzemultiply
{
private List<uint> value = new List<uint>();
private Boolean checkout = false;
private logenzemultiply() { }
private void check(string tocheck, out Boolean _check)
{
uint temp;
int countcheck = 0;
for(countcheck = 0; countcheck < tocheck.Length; ++countcheck)
{
if (!UInt32.TryParse(tocheck[countcheck].ToString(), out temp))
{
break;
}
}
if (countcheck == tocheck.Length)
{
_check = true;
}
else
{
_check = false;
}
}
public logenzemultiply(string tocopy)
{
check(tocopy, out checkout);
if (!this.checkout)
{
value = null;
return;
}
uint temp;
if (tocopy != null && value != null)
{
for (int copylength = 0; copylength < tocopy.Length; ++copylength)
{
uint.TryParse(tocopy[copylength].ToString(), out temp);
value.Add(temp);
}
}
}
public void showvalue()
{
if (value != null)
{
for (int countvalue = 0; countvalue < value.Count; ++countvalue)
{
Console.Write(value[countvalue].ToString());
}
Console.WriteLine("");
}
}
public List<uint> returnvalue()
{
return this.value;
}
public string multiply(ref logenzemultiply bignumber2)
{
int len1 = this.value.Count;
int len2 = bignumber2.returnvalue().Count;
int countcolumn = 0;
int countrow = 0;
uint[,] convertcolumn= new uint[len2 + 1, len1 + 1];
for (countrow = 0; countrow < len2 + 1; ++countrow)
{
for (countcolumn = 0; countcolumn < len1 + 1; ++countcolumn)
{
convertcolumn[countrow, countcolumn] = 0;
}
}
for (countcolumn = 1; countcolumn < len1 + 1; ++countcolumn)
{
convertcolumn[0, countcolumn] = this.value[countcolumn - 1];
}
for (countrow = 1; countrow < len2 + 1; ++countrow)
{
convertcolumn[countrow, 0] = bignumber2.returnvalue()[countrow - 1];
}
for (countrow = 1; countrow < len2 + 1; ++countrow)
{
for (countcolumn = 1; countcolumn < len1 + 1; ++countcolumn)
{
convertcolumn[countrow, countcolumn] = convertcolumn[countrow, 0] * convertcolumn[0, countcolumn];
}
}
uint[] convertarray = new uint[len1 + len2];
for (countcolumn = 0; countcolumn < len1 + len2; ++countcolumn)
{
convertarray[countcolumn] = 0;
}
countcolumn = len1;
countrow = len2;
int countadd = len1 + len2;
while (countadd> 1)
{
while(countcolumn + countrow == countadd && countrow <= len2 && countcolumn >= 1)
{
convertarray[countadd - 1] += convertcolumn[countrow, countcolumn];
--countcolumn;
++countrow;
}
if (countrow > len2 || countcolumn < 1)
{
if (countadd > len1 + 1)
{
countcolumn = len1;
countrow = countadd - 1 - countcolumn;
}
else
{
countrow = 1;
countcolumn = countadd - 1 - countrow;
}
}
--countadd;
}
for (countcolumn = len1 + len2; countcolumn > 0; --countcolumn)
{
if (convertarray[countcolumn - 1] > 9)
{
convertarray[countcolumn - 2] += convertarray[countcolumn - 1] / 10;
convertarray[countcolumn - 1] = convertarray[countcolumn - 1] % 10;
}
}
string result = "";
string resulttemp = "";
countcolumn = 0;
while (countcolumn < len1 + len2)
{
resulttemp = result.Insert(result.Length, convertarray[countcolumn].ToString());
result = resulttemp;
countcolumn++;
}
while (result.StartsWith("0"))
{
resulttemp = result.Substring(1);
result = resulttemp;
}
return result;
}
static void Main(string[] args)
{
logenzemultiply aaa = new logenzemultiply("11234567890");
logenzemultiply bbb = new logenzemultiply("00123456788");
aaa.showvalue();
bbb.showvalue();
Console.WriteLine(aaa.multiply(ref bbb));
logenzemultiply ccc = new logenzemultiply("123");
logenzemultiply ddd = new logenzemultiply("011");
ccc.showvalue();
ddd.showvalue();
string getresult = ccc.multiply(ref ddd);
Console.WriteLine(getresult);
}
}
}