代码题(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; }