[整理总结]极大数相乘(C#)

极大数乘法。举例说明:123*456

            123

*          456

————————

            738

          615

        492

---------------

        56088

算法思想是:以第二个数的每一位分别乘以第一位数的每一位然后相加,当然这其中要考虑的如下三个问题:

1.确保是正确的位数

2.进位问题

3.相加的位置问题

现描述如下假设极大数是以string存储的,那么以以下的方式转换为int数组

1.数组的第一个位置存储极大数的位数

2.数组以倒序的方式存储数字个十百千万.... 上的值

如string a = “123” 那么转换的数组为int[] aa = (3, 3, 2, 1);

因为当两个数相乘的时候结果的位数是小于等于两个数的位数之和

因此用上面的例子来说明的话

string a = “123”  数组:int[] aa = (3, 3, 2, 1);

string b = “456”  数组:int[] bb = (3, 6, 5, 4);

string result = ?? 数组:int[] resultarray = new int[7];

 

 

现在给出如下的算法:

 

在此进位是从如下的考虑的,什么时候该让result的位数加 1了?

当 l == 位数+1 的时候,这个时候就表示现有的位数已经不够了,因此需要位数增加

进位问题是通过取余来获得的,并且是通过 mul += carry;其中carry是上一个位置产生的进位例如123*456的时候,从第二个数开始
分别乘以第一个数,当6*2的时候应该是把6*3的结果产生1的进位给加上去

相加的位置问题,通过两个循环变量,l和k   k meaning the middle result, l meaning the last result

因为每一次的第二层循环结束时,都确定了一位,例如第一次对应的是个位,第二次对应的是十位,第三次对应的是百位,而相应的存储在数组中的位置依次是result[1],result[2],result[3],依次类推,每一次的第二层循环都确定一个数直至最后得出结果

 

 

该程序已经在C# 中测试,已经测试通过

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值