迅速なアルゴリズム:乗算文字列

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/lin1109221208/article/details/91389301

1.説明

文字列として表される2つの非負整数NUM1とNUM2与えられ、製品NUM1をNUM2を返し、その生成物はまた、文字列として表現されます

例1:

      入力:NUM1 = "2"、NUM2 = "3"

      出力: "6"

例2:

      入力:NUM1 = "123"、NUM = "456"

      出力: "56088"

説明:

長さ1、NUM1とNUM2は110未満であります

2、NUM1とNUM2は0-9が含まれています

それ自体番号0でない限り3、NUM1とNUM2は、ゼロで開始しません

図4は、処理された整数に任意(例えばBigIntegerのような)多数の標準ライブラリの種類、または直接入力を使用することはできません

 

2、アルゴリズム

アナログ乗算、反転最初の文字列、キャリーハンドルの前で低くなるように

func multiply(_ num1: String, _ num2: String) -> String {
        
        if num1=="0" || num2=="0" {
            return "0"
        }
        
        var res : [Int] = [Int].init(repeating: 0, count: num1.count+num2.count)
        
        var num1Arr : [Int] = stringToArr(num1)
        var num2Arr : [Int] = stringToArr(num2)
        print(num1Arr)
        print(num2Arr)
        
        //遍历数组
        for i in 0..<num1Arr.count {
            for j in 0..<num2Arr.count{
                //记录两两相乘的结果
                res[i+j] += num1Arr[i]*num2Arr[j]
            }
        }
        //进位值
        var carrys = 0
        //将两两相乘的结果遍历
        for i in 0..<res.count {
            res[i] += carrys
            carrys = res[i]/10
            res[i] %= 10
        }
        if carrys != 0 {
            res[res.count-1] = carrys
        }
        //结果值正序
        res = res.reversed()
        
        var str : String = ""
        var i = res[0]==0 ? 1 : 0
        for _ in i..<res.count {
            str += String(res[i])
            
            i += 1
        }
        
        return str
        
    }
    
    //将字符串转换成数组并反转顺序
    private func stringToArr(_ str : String)->[Int]{
        var result : [Int] = []
        for i in str{
            result.append(stringToInt(String(i)))
        }
        //字符数组倒序存储
        result = result.reversed()
        return result
    }
    
    //字符利用ascii转换为整数值
    private func stringToInt(_ char : String)->Int{
        var result : Int = 0
        var result1 : Int = 0
        
        for characterInt in char.unicodeScalars {
            result = Int(characterInt.value)
        }
        for characterInt in "0".unicodeScalars {
            result1 = Int(characterInt.value)
        }
//        print(result-result1)
        return result-result1
    }


调用:
        print(multiply("2", "3"))
        print(multiply("123", "456"))

运行结果:

[2]
[3]
6

[3, 2, 1]
[6, 5, 4]
56088

 

おすすめ

転載: blog.csdn.net/lin1109221208/article/details/91389301