zoukankan      html  css  js  c++  java
  • 代码题(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] = '';
            for (int i = 0; i < 10; ++i)
            {
                num[0] = i + '0';
                maxNum(num, n, 0);
            }
            cout << endl;
        }
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    声明对象指针,调用构造、析构函数的多种情况
    [C++ STL] 常用算法总结
    [C++ STL] map使用详解
    [C++ STL] set使用详解
    [C++ STL] list使用详解
    [C++ STL] deque使用详解
    Servlet课程0424(一) 通过实现Servlet接口来开发Servlet
    CSS盒子模型
    Spring学习之第一个hello world程序
    Java基础面试题
  • 原文地址:https://www.cnblogs.com/eilearn/p/9554392.html
Copyright © 2011-2022 走看看