016
大数加法_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
由于相加超过10要进位,因此需要从从后往前将每个数相加得到tmp,超过10时,该位只放tmp%10后的结果,同时将tmp/=10,进入下一位的相加中。
class Solution {
public:
string solve(string s, string t)
{
string ret;
int i=s.size()-1,j=t.size()-1;
int tmp=0;
while(i>=0 || j>=0 || tmp)
{
if(i>=0) tmp+=s[i--]-'0';
if(j>=0) tmp+=t[j--]-'0';
ret+=tmp%10+'0';
tmp/=10;
}
reverse(ret.begin(),ret.end());
return ret;
}
};
017
链表相加(二)_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
加法需要考虑进位,应该从个位开始相加,与链表顺序相反,所以先将链表逆序再相加。
/**
* 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;
//newHead->next=nullptr;
delete newHead;
return cur;
}
ListNode* addInList(ListNode* head1, ListNode* head2)
{
//1.逆序
head1=reverse(head1);
head2=reverse(head2);
//2.高精度加法
int t=0;
ListNode* cur1=head1,* cur2=head2;
ListNode* ret=new ListNode(0);
ListNode* prev=ret;
while(cur1 || cur2 || t)
{
if(cur1)
{
t+=cur1->val;
cur1=cur1->next;
}
if(cur2)
{
t+=cur2->val;
cur2=cur2->next;
}
prev->next=new ListNode(t%10);
prev=prev->next;
t/=10; //t保存进位
}
cur1=ret->next;
ret->next=nullptr;
delete ret;
return reverse(cur1);
}
};
018
大数乘法_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
根据乘法分配率,可以将每位相乘结果无进位相加,再单独进位。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
string solve(string s, string t)
{
reverse(s.begin(),s.end());
reverse(t.begin(),t.end());
int m=s.size(),n=t.size();
vector<int> tmp(m+n);
//1.无进位相乘
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
tmp[i+j]+=(s[i]-'0')*(t[j]-'0');
}
}
//2.进位
int c=0;
string ret;
for(auto x:tmp)
{
c+=x;
ret+=c%10+'0';
c/=10;
}
while(c)
{
ret+=c%10+'0';
c/=10;
}
//3.处理前导零
while(ret.size()>1 && ret.back()=='0') ret.pop_back();
reverse(ret.begin(),ret.end());
return ret;
}
};