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

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

问题描述:

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

    String A="123456712345567";

    String B="1234567812345678";

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

 

我的思路:

  1. 先将字符串转化为整数数组(每个数字字符减去48即可)

2.开一个长度为A.Le

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

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

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.     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值