代码题(59)— 字符串相加、字符串相乘、打印最大n位数

1、415. 字符串相加

  给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

  思路:和链表相加类似,求进位。

class Solution {
public:
    string addStrings(string nums1, string nums2) {
        string res;
        if(nums1.empty() || nums2.empty())
            return res;
        int m=nums1.size()-1;
        int n=nums2.size()-1;
        int carry=0;
        while(m>=0 || n>=0)
        {
            int a = m>=0 ? nums1[m--]-'0' : 0;
            int b = n>=0 ? nums2[n--]-'0' : 0;
            int sum = a+b+carry;
            res.insert(res.begin(),sum%10+'0');
            carry = sum/10;
        }
        return carry ? '1'+res : res;       
    }
};

2、43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

首先我们把每一位相乘,得到一个没有进位的临时结果,如图中中间的一行红色数字就是临时结果,然后把临时结果从低位起依次进位。对于一个m位整数乘以n位整数的结果,最多只有m+n位。

注意:结果中需要去掉前导0,还需要注意结果为0的情况

class Solution {
public:
    string multiply(string num1, string num2) {
        string res;
        if (num1.empty() || num2.empty())
            return res;
        int n1 = num1.size();
        int n2 = num2.size();
        vector<int> vec(n1 + n2, 0);
        int k = n1 + n2 - 2;
        // 计算对应位置相乘
        for (int i = 0; i<n1; i++)
        {
            for (int j = 0; j<n2; ++j)
                vec[k - i - j] += (num1[i] - '0') * (num2[j] - '0');
        }
        int carry = 0;
        for (int i = 0; i<(n1 + n2); ++i) // 求进位
        {
            vec[i] += carry;
            carry = vec[i] / 10;
            vec[i] %= 10;
        }
        int i = k + 1;
        while (vec[i] == 0)
            i--;//去掉乘积的前导0
        if (i < 0)
            return "0"; //注意乘积为0的特殊情况
        for (; i >= 0; i--)
            res.push_back(vec[i] + '0');
        return res;

    }
};

 3、打印最大n位数

  输入数字n,顺序打印从1到n位的数,1,2,3.....999

  使用大数字符串,全排列递归打印。

void printNum(vector<char> &num)
{
    bool flag = true;
    for (int i=0; i <num.size() ; ++i)
    {
        if (flag && num[i] != '0')
            flag = false;
        if (!flag)
            cout << num[i];
    }
    cout << " ";
}

void maxNum(vector<char> &num, int n, int index)
{
    if (index == n - 1)
    {
        printNum(num);
        return;
    }
    for (int i = 0; i < 10; ++i)
    {
        num[index+1] = i + '0';
        maxNum(num, n, index + 1);
    }
}

int main()
{
    int n;
    while (cin>>n)
    {
        vector<char> num(n+1);
        num[n] = '\0';
        for (int i = 0; i < 10; ++i)
        {
            num[0] = i + '0';
            maxNum(num, n, 0);
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

 

posted @ 2018-08-29 15:05  深度机器学习  阅读(441)  评论(0编辑  收藏  举报