大整数数相乘的一个解决方案(附c# 代码)

问题描述:

给两个包含数字字符的长度为n的字符串A和B(假设都是数字字符) 如:

    String A="123456712345567";

    String B="1234567812345678";

要求将 A和B中的数值相乘结果以字符串输出结果。

 

我的思路:

  1. 先将字符串转化为字符数组(每个数字字符减去48即可得到真实的电脑认识的数字) ,具体根据ASCII码核对下 0字符是电脑48 ,1字符电脑49..以此类推

      2.开一个长度为A.Length+B.Length的整数数组(长度为n和长度为m的两个整数相乘结果的长度为x, (n+M)>=x>=Max(n,m))

            两数相乘的结果位数=两数位数之和或两数位数之和减1: 55(2位)*60(2位)=3300(4位)  ;(2位)15*(2位)60=900(3位)

     3 .然后从数组的末尾开始逐位相乘,将A数组的第i位和B数组第j位的相乘的结果对10求余,余数放入结果数组的[i+j+1]位.对10除,除数放入第i+j 位。依次类推

           单数相乘的结果要么二位数要么一位数 

         6 * 6=36  

第2位数第1位数
36除10取整36取模10
结果:3结果:6

 

   16*26=416;拆分结果  (1位)6*(1位)6=3(2位)6(1位)  + (1位)6*(2位)2=1(3位)2(2位) + (2位)1*(1位)6=6(2位) + (2位)1*(2位)2=2(3位)

                            

 3位2位1位
  36
 12 
  6 
 2  
合计416
  

                                                                   

 

 

A

 

0

1

 

...

   

i

   

n

 

                                                                              B

0

1

 

...

   

j

   

m     

                                                                               

Result:                                                                  %           *

0

1

       

I+j+1

   

M+n-1

 

完整代码:(粗体处为核心代码)

 

 

  1.  class Program {
  2.         static void Main(string[] args) {
  3.             String num1 = "100";
  4.             String num2 = "83387458293452";
  5.             BigNumberMultiply bnm = new BigNumberMultiply(num1,num2);
  6.             Console.WriteLine(bnm.Multiply());
  7.         }
  8.     }
  9.     class BigNumberMultiply {
  10.         String num1;
  11.         String num2;
  12.         
  13.         public BigNumberMultiply(String num1,String num2) {
  14.             this.num1 = num1;
  15.             this.num2 = num2;
  16.         }
  17.         public String Multiply(){
  18.             int num1Length = num1.Length;
  19.             int num2Length = num2.Length;
  20.             //tranfor the string to int array
  21.             int[] inum1 = new int[num1Length];
  22.             for (int i = 0; i < num1Length; i++) {
  23.                 inum1[i] = (int)num1[i]-48;
  24.             }
  25.             int[] inum2 = new int[num2Length];
  26.             for (int i = 0; i < num2Length; i++) {
  27.                 inum2[i] = (int)num2[i] - 48;
  28.             }
  29.             int[] result=new int[num1Length+num2Length];
  30.             for (int i = num1Length - 1; i >= 0; i--) {
  31.                 for (int j = num2Length - 1; j >= 0; j--) {
  32.                     result[i + j+1] += inum1[i] * inum2[j];
  33.                     result[i + j] += result[i + j+1] / 10;
  34.                     result[i + j+1] %= 10;
  35.                 }
  36.             }
  37.             char[] temp=new char[num1Length+num2Length];
  38.             for(int i=0;i<(num1Length+num2Length);i++){
  39.                 temp[i]=(char)(result[i]+48);
  40.             }
  41.             String sResult = new String(temp);
  42.             return sResult;
  43.         }
  44.     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值