大数相乘(2)

大数相乘(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);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值