字符串四则运算之三无限位数相乘的设计

本文详细介绍了无限位数相乘的设计规则、针对‘0’的处理方法、乘法本质及其累加乘法设计,包括相关代码实现与优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

* 无限位数相乘的设计: 
* 规则:从乘数的个位起分别与被乘数的个位起的各位相乘,积大于10的十位的数作为进位,个位作为位积,进位与下位积相加,乘数十位的积乘10(即最后面补1个0)后与个位的积相加,百位的积乘100(即最后面补2个0)后与上次的积相加,依次类推;
* 针对“0”的处理:修改相关语句及部分代码优化;
* 乘法的本质是一个数的累加法的概括,因此,可以用加法去实现乘法,如2+2+2=6,有3个2进行累加,因此,乘法表达式为2*3=6;
* 累加乘法的设计:
        static string 无限位数相乘(string 被乘数, string 乘数, bool 科学记标 = false)
        {
            if (乘数 == "0") return "0";/*针对“0”的处理*/
            if (乘数 == "1") return 被乘数;/*针对乘数“1”的优化,不入运算*/
            string 位积 = "", 积 = "", 权 = "", 乘位值 = "";
            int 位1 = 0, 序 = 乘数.Length - 1, 进位值 = 0, 个数 = 0;
            if (科学记标)
            {
                int 划分 = 被乘数.IndexOf("×");
                if (划分 > 0)
                {
                    个数 = int.Parse(被乘数.Substring(划分 + 4));
                    被乘数 = 被乘数.Substring(0, 划分);
                }
            }
            Action 位数相乘 = delegate()
            {
                位1 = 被乘数.Length - 1; 位积 = ""; 进位值 = 0;
                do
                {
                    int 相乘值 = int.Parse(被乘数[位1].ToString()) * int.Parse(乘位值) + 进位值;/*写法适用于任意位的运算*/
                    进位值 = 相乘值 > 9 ? 相乘值 / 10 : 0;/*获取进位*/
                    位积 = (相乘值 % 10).ToString() + 位积;/*合成*/
                } while (--位1 >= 0);
                if (进位值 > 0)
                    位积 = 进位值.ToString() + 位积;/*最后合成*/
            };
            乘位值 = 乘数[序--].ToString();/*针对“0”的处理*/
            if (乘位值 != "0")/*首次个位积*/
            {
                位数相乘();
                积 = 位积;
            }
            while (序 >= 0)
            {
                权 += "0";/*十位起提升位数*/
                乘位值 = 乘数[序--].ToString();/*针对“0”的处理*/
                if (乘位值 != "0")
                {
                    位数相乘();
                    积 = 无限位数相加(积, 位积 + 权)[0];
                }
            }
            if (科学记标)
            {
                int 记法 = 积.Length;
                while (积[--记法] == '0') ++个数;
                if (个数 >= 4)
                    积 = 积.Substring(0, 记法 + 1) + "×10^" + 个数.ToString();
            }
            return 积;
        }
        调用:
            /*累加乘法的设计*/
            string 被乘数 = "12345", 乘数 = "123", 积 = "";
            int 序 = 2;/*第一次计算为2个数相加,因此,设为2开始*/
            do
            {
                积 = 无限位数相加((积 == "" ? 被乘数 : 积), 被乘数);
            } while (++序 <= int.Parse(乘数));
            Console.WriteLine("正确运算:{0}", 积);
            /*如果,乘数超过int范围,循环条件的比较表达式应改为其它比较方式,返回布尔值*/     
        验证:
            int aa = 1;
            while (aa * aa > 0)
            {
                string aaaa = 无限位数相乘(aa.ToString(), aa.ToString());
                if (aaaa == (aa * aa++).ToString())
                    Console.WriteLine("相乘运算:{0}", aaaa.ToString());
                else
                    Console.WriteLine("运算:{0}", aa.ToString());
            } 
            int aa = 1; string 阶乘 = "1";
            do
            {
                阶乘 = 无限位数相乘(阶乘, aa.ToString());
                Console.Write("正确运算:{0}阶", aa.ToString());
                Console.WriteLine("={0}", 阶乘);
            } while (++aa <= 100);
            改为可接续int最大位数字符串范围运算:
            string aa = "1"; string 阶乘 = "1";
            List<string> 读积与乘数 = 读文本记录(@System.Environment.CurrentDirectory + "\\求阶乘\\积与乘数.txt");
            if (读积与乘数.Count > 0) { 阶乘 = 读积与乘数[0]; aa = 读积与乘数[1]; }
            do
            {
                阶乘 = 无限位数相乘(阶乘, aa);
                Console.Write("运算:{0}阶", aa);
                Console.WriteLine("={0}", 阶乘);
                写改记录(aa + "阶" + "=" + 阶乘 + "\r\n", "求阶乘", "阶乘集", aa);
                aa = 无限位数相加(aa, "1");
                写改记录(阶乘 + "\r\n" + aa, "求阶乘", "积与乘数", aa, false);
            } while (阶乘.Length < int.MaxValue);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值