大数相乘(2)

来源:互联网 发布:医用软件开发 书籍 编辑:程序博客网 时间:2024/05/16 12:26

大数相乘(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);        }    }}
原创粉丝点击