大数加法
题目链接:大数加法_牛客题霸_牛客网 (nowcoder.com)
思路:大数相加 大数相乘都是模板题
详见:AcWing 793. 高精度乘法 A x b 和 A x B 的模版(大数相加、大数相乘通用模板) - AcWing
AC code
#include <string>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
string solve(string s, string t)
{
if(t == "" && s == "")
return "0";
if(t == "")
return s;
if(s == "")
return t;
vector<int>a,b,c;
for(int i = s.size() - 1; i >= 0; i --)
a.push_back(s[i] - '0');
for(int i = t.size() - 1; i >= 0; i --)
b.push_back(t[i] - '0');
int len1 = min(s.size(), t.size());
int len2 = max(s.size(), t.size());
int tmp = 0;
for(int i = 0; i < len1; i ++)
{
tmp += a[i] + b[i];
c.push_back(tmp % 10);
tmp /= 10;
}
for(int i = len1; i < len2; i ++)
{
if(s.size() >= t.size())
tmp += a[i];
else
tmp += b[i];
c.push_back(tmp % 10);
tmp /= 10;
}
if(tmp >= 1) c.push_back(tmp);
string ans = "";
for(int i = c.size() - 1; i >= 0; i --)
ans += to_string(c[i]);
return ans;
}
};
NC40 链表相加(二)
题目链接:链表相加(二)_牛客题霸_牛客网 (nowcoder.com)
思路:原理一样 不过讨了个链表的皮 先将链表反转 再加即可
AC code:
class Solution {
public:
//反转链表
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL)
return NULL;
ListNode* cur = pHead;
ListNode* pre = NULL;
while(cur != NULL){
//断开链表,要记录后续一个
ListNode* temp = cur->next;
//当前的next指向前一个
cur->next = pre;
//前一个更新为当前
pre = cur;
//当前更新为刚刚记录的后一个
cur = temp;
}
return pre;
}
ListNode* addInList(ListNode* head1, ListNode* head2) {
//任意一个链表为空,返回另一个
if(head1 == NULL)
return head2;
if(head2 == NULL)
return head1;
//反转两个链表
head1 = ReverseList(head1);
head2 = ReverseList(head2);
//添加表头
ListNode* res = new ListNode(-1);
ListNode* head = res;
//进位符号
int carry = 0;
//只要某个链表还有或者进位还有
while(head1 != NULL || head2 != NULL || carry != 0){
//链表不为空则取其值
int val1 = head1 == NULL ? 0 : head1->val;
int val2 = head2 == NULL ? 0 : head2->val;
//相加
int temp = val1 + val2 + carry;
//获取进位
carry = temp / 10;
temp %= 10;
//添加元素
head->next = new ListNode(temp);
head = head->next;
//移动下一个
if(head1 != NULL)
head1 = head1->next;
if(head2 != NULL)
head2 = head2->next;
}
//结果反转回来
return ReverseList(res->next);
}
};
大数乘法
题目链接:大数乘法_牛客题霸_牛客网 (nowcoder.com)
AC code:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
string solve(string s, string t)
{
vector<int>a,b;
for(int i = s.size() - 1; i >= 0; i --)
a.push_back(s[i] - '0');
for(int i = t.size() - 1; i >= 0; i --)
b.push_back(t[i] - '0');
vector<int>c(a.size() + b.size() + 10, 0);
for (int i = 0; i < a.size(); i++)
for (int j = 0; j < b.size(); j++)
c[i + j] += a[i] * b[j];
int tmp = 0;
for (int i = 0; i < c.size(); i++)
{ // i = C.size() - 1时 t 一定小于 10
tmp += c[i];
c[i] = tmp % 10;
tmp /= 10;
}
while (c.size() > 1 && c.back() == 0) c.pop_back(); // 必须要去前导 0,因为最高位很可能是 0
string ans = "";
for(int i = c.size() - 1; i >= 0; i --)
ans += to_string(c[i]);
cout << ans << endl;
return ans;
}
};