zoukankan      html  css  js  c++  java
  • 【一天一道算法题】 两个字符串相乘

    最近在面试某大厂,跪在了最后一面技术面上。面试官要求带电脑,并在40分钟内当场完成一道题并要求跑通。

    题目是两个数字字符串相乘,得出的结果也用字符串输出。例如给string a = "123", string b = "456",求出结果字符串。

    回来仔细思考了一下,并在1小时内完成了这道题。

    思路如下:

    要计算123 * 456,可以模拟我们自己在进行乘法运算的过程,先计算6 * 123 = 738, 再计算5*123 = 615, 再计算4*123 = 492。

    最后再对三个字符串做移位相加。移位就是在后面补零。如果字符串还不相等,就在前面补0,知道两个字符串长度相等,再进行相加操作。

    代码如下:

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    
    //单个字符与字符串相乘的结果
    string multiply(string a, char b)
    {
        int len = a.size();
        int i0 = 0, i1 = 0;
        int current;
        int temp = 0;
        string res;
        for(int i=len-1;i>=0;i--)
        {
            current = (a[i] - '0')*(b-'0') + temp;
            i0 = current%10; //个位
            i1 = current/10; //十位
            res = char(i0 + '0') + res;
            temp = i1;
        }
        if(i1!=0)
            res = char(i1 + '0') + res;
        return res;
    }
    
    //两个字符串错位相加
    string add(string a, string b, int b_shift)
    {
        string res;
        
        if(a.size() == 0)
            return b;
        for(int i=0;i<b_shift;i++)
            b = b + '0';
        
       
        int len_a = a.size();
        int len_b = b.size();
        int diff = len_a - len_b;
        if(diff>0)
        {
            for(int i=0;i<diff;i++)
                b = '0' + b;
        }
        else if(diff<0)
        {
            for(int i=0;i<abs(diff);i++)
            {
                a = '0' + a;
            }
        }
        
        int len = a.size();
        int current;
        int temp = 0;
        int i0 = 0, i1 = 1;
        for(int i=len-1;i>=0;i--)
        {
            current = a[i] - '0' + b[i] - '0' + temp;
            i0 = current%10;
            i1 = current/10;
            
            res = char(i0 + '0') + res;
            temp = i1;
        }
        if(i1>0)
            res = char(i1 + '0') + res;
        return res;
    }
    
    //两个字符串相乘
    string multiply(string a, string b)
    {
        int len_a = a.size();
        int len_b = b.size();
        
        string current;
        string res;
        for(int i=b.size()-1;i>=0;i--)
        {
            current = multiply(a, b[i]);
            res = add(res, current, b.size() - i -1);
        }
        return res;
    }
    int main()
    {
        string a = "98376";
        string b = "51209";
        string res = multiply(a, b);
        cout<<res<<endl;
    }

     其实题目本身并不难,说面试时紧张也好,同时平时编码少,说缺乏熟练度也好,总之跪在了最后一面。

    非常遗憾,今后仍需要加强编码。

  • 相关阅读:
    使用JDK创建webService
    eclipse换工作空间要做的事情
    JAVA输出表格(适配中英文)
    linux下如何用GDB调试c++程序
    C++编译的四个步骤
    linux下如何设置root密码(第一次)
    chp01、Dreamweaver介绍
    服务器端程序
    1_计算机网络概述
    Oracle Java JDBC: Get Primary Key Of Inserted Record
  • 原文地址:https://www.cnblogs.com/corineru/p/11173245.html
Copyright © 2011-2022 走看看