目录
1. 大数加法
2.链表相加(二)
3.大数乘法
1. 大数加法
大数加法_牛客题霸_牛客网
算法思路:
这就是一道模拟题,模拟加法列竖式运算的过程。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
string solve(string s, string t)
{
int m = s.size() -1, n = t.size() -1;
int tmp = 0;//保存进位
string ret;
while (m >= 0 || n >= 0 || tmp)
{
if(m >= 0)
{
tmp += s[m--] - '0';
}
if(n >= 0)
{
tmp += t[n--] - '0';
}
ret += tmp % 10 + '0';
tmp /= 10;
}
reverse(ret.begin(), ret.end());
return ret;
}
};
2.链表相加(二)
链表相加(二)_牛客题霸_牛客网
算法思路:
这道题与上一道题类似,只不过换成了链表,只需要注意第一步一定要先将链表逆置,其他的步骤与上一题相同。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* reverse(ListNode *head)//是用头插法逆直链表
{
ListNode * newhead = new ListNode(0);//添加一个头节点
ListNode * cur = head;
while (cur)
{
ListNode * next = cur->next;
cur->next = newhead->next;
newhead->next = cur;
cur = next;
}
cur = newhead->next;
delete newhead;
return cur;
}
ListNode* addInList(ListNode* head1, ListNode* head2)
{
head1 = reverse(head1);
head2 = reverse(head2);
int tmp = 0;
ListNode * cur1 = head1;
ListNode * cur2 = head2;
ListNode * ret = new ListNode(0);
ListNode * prev = ret;
while (cur1 || cur2 || tmp)
{
if(cur1)
{
tmp += cur1->val;
cur1 = cur1->next;
}
if(cur2)
{
tmp += cur2->val;
cur2 = cur2->next;
}
prev->next = new ListNode(tmp % 10);
prev = prev->next;
tmp /= 10;
}
prev = ret;
ret = ret->next;
delete prev;
ret = reverse(ret);
return ret;
}
};
3.大数乘法
大数乘法_牛客题霸_牛客网
算法思路:
同样也是一道模拟题,使用无进位相乘相加进行优化。
使用数组将每一位都存储起来,最后统一处理进位
#include <iterator>
class Solution {
public:
string solve(string s, string t)
{
reverse(s.begin(), s.end());
reverse(t.begin(), t.end());
string ret;
int n = s.size(), m = t.size();
vector<int> v(m + n);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
v[i + j] += (s[i] - '0') * (t[j] - '0');
}
}
//处理进位
int c = 0;
for(int x : v)
{
c += x;
ret += c % 10 + '0';
c /= 10;
}
while(c)
{
ret += c % 10 + '0';
c /= 10;
}
while(ret.size() > 1 && ret.back() == '0')
{
ret.pop_back();
}
reverse(ret.begin(), ret.end());
return ret;
}
};