问题描述:
给两个包含数字字符的长度为n的字符串A和B(假设都是数字字符) 如:
String A="123456712345567";
String B="1234567812345678";
要求将 A和B中的数值相乘结果以字符串输出结果。
我的思路:
-
先将字符串转化为字符数组(每个数字字符减去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位 | |
3 | 6 | ||
1 | 2 | ||
6 | |||
2 | |||
合计 | 4 | 1 | 6 |
A
0 | 1 | ... | i | n |
B
0 | 1 | ... | j | m |
Result: % *
0 | 1 | I+j+1 | M+n-1 |
完整代码:(粗体处为核心代码)
- class Program {
- static void Main(string[] args) {
- String num1 = "100";
- String num2 = "83387458293452";
- BigNumberMultiply bnm = new BigNumberMultiply(num1,num2);
- Console.WriteLine(bnm.Multiply());
- }
- }
- class BigNumberMultiply {
- String num1;
- String num2;
- public BigNumberMultiply(String num1,String num2) {
- this.num1 = num1;
- this.num2 = num2;
- }
- public String Multiply(){
- int num1Length = num1.Length;
- int num2Length = num2.Length;
- //tranfor the string to int array
- int[] inum1 = new int[num1Length];
- for (int i = 0; i < num1Length; i++) {
- inum1[i] = (int)num1[i]-48;
- }
- int[] inum2 = new int[num2Length];
- for (int i = 0; i < num2Length; i++) {
- inum2[i] = (int)num2[i] - 48;
- }
- int[] result=new int[num1Length+num2Length];
- for (int i = num1Length - 1; i >= 0; i--) {
- for (int j = num2Length - 1; j >= 0; j--) {
- result[i + j+1] += inum1[i] * inum2[j];
- result[i + j] += result[i + j+1] / 10;
- result[i + j+1] %= 10;
- }
- }
- char[] temp=new char[num1Length+num2Length];
- for(int i=0;i<(num1Length+num2Length);i++){
- temp[i]=(char)(result[i]+48);
- }
- String sResult = new String(temp);
- return sResult;
- }
- }