算法模板
高精度加法
两个位数很多的正数相加
#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int> a,vector<int> b){
vector<int> res;
int t=0;
for(int i=0;i<a.size() || i<b.size();i++){
if(i<a.size())
t+=a[i];
if(i<b.size())
t+=b[i];
res.push_back(t%10);
t/=10;
}
if(t)
res.push_back(t);
return res;
}
int main(){
string a,b;
cin>>a>>b;
vector<int> nums1,nums2;
for(int i=a.size()-1;i>=0;i--)
{
nums1.push_back(a[i]-'0');
}
for(int i=b.size()-1;i>=0;i--)
{
nums2.push_back(b[i]-'0');
}
auto ans=add(nums1,nums2);
for(int i=ans.size()-1;i>=0;i--){
printf("%d",ans[i]);
}
return 0;
}
高精度减法
两个位数很多的正数相减
#include<iostream>
#include<vector>
using namespace std;
vector<int> subtract(vector<int> &a,vector<int> &b){
vector<int> res;
for(int i=0,t=0;i<a.size();i++){
t=a[i]-t;
if(i<b.size())
t-=b[i];
res.push_back((t+10)%10);
if(t<0) t=1; //判断借位
else t=0;
}
while(res.size()>1 && res.back()==0) //去掉计算结果中的前导0
res.pop_back();
return res;
}
bool cmp(vector<int> &a,vector<int> &b){
if(a.size()!=b.size())
return a.size()>b.size();
for(int i=a.size()-1;i>=0;i--){
if(a[i]!=b[i])
return a[i]>b[i];
}
return true;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> nums1,nums2;
for(int i=a.size()-1;i>=0;i--)
nums1.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--)
nums2.push_back(b[i]-'0');
if(cmp(nums1,nums2))
{
auto ans=subtract(nums1,nums2);
for(int i=ans.size()-1;i>=0;i--)
printf("%d",ans[i]);
}
else{
auto ans=subtract(nums2,nums1);
printf("-");
for(int i=ans.size()-1;i>=0;i--)
printf("%d",ans[i]);
}
return 0;
}
高精度乘法
大数乘小数
#include<iostream>
#include<vector>
using namespace std;
vector<int> multiply(vector<int> &a,int b){
vector<int> res;
int t=0;
for(int i=0;i<a.size() || t;i++){
if(i<a.size())
t+=a[i]*b;
res.push_back(t%10);
t/=10;
}
return res;
}
bool cmp(vector<int> &a,vector<int> &b){
if(a.size()!=b.size())
return a.size()>b.size();
for(int i=a.size()-1;i>=0;i--){
if(a[i]!=b[i])
return a[i]>b[i];
}
return true;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector<int> nums;
for(int i=a.size()-1;i>=0;i--)
nums.push_back(a[i]-'0');
auto res=multiply(nums,b);
for(int i=res.size()-1;i>=0;i--)
printf("%d",res[i]);
return 0;
}
高精度除法
大数除以小数
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> divide(vector<int> &a,int b,int &r){
vector<int> res;
r=0;
for(int i=a.size()-1;i>=0;i--)
{
r=r*10+a[i];
res.push_back(r/b);
r%=b;
}
reverse(res.begin(),res.end());
while(res.size()>1 && res.back()==0)
res.pop_back();
return res;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector<int> nums;
for(int i=a.size()-1;i>=0;i--)
nums.push_back(a[i]-'0');
int r;
auto res=divide(nums,b,r);
for(int i=res.size()-1;i>=0;i--)
printf("%d",res[i]);
printf("\n%d",r);
return 0;
}
class Solution {
public String addStrings(String num1, String num2) {
int len1=num1.length(),len2=num2.length();
int len=Math.max(len1,len2)+1,a=0,b=0,flag=0;
int[] arr=new int[len];
for(int i=0;i<len;i++)
{
a=len1-i-1<0?0:num1.charAt(len1-i-1)-'0';
b=len2-i-1<0?0:num2.charAt(len2-i-1)-'0';
arr[len-i-1]=a+b+flag;
if(arr[len-i-1]>=10)
{
arr[len-i-1]-=10;
flag=1;
}
else
flag=0;
}
StringBuilder sb=new StringBuilder();
if(arr[0]==0)
{
for(int i=1;i<len;i++)
sb.append(arr[i]);
}
else
{
for(int i=0;i<len;i++)
sb.append(arr[i]);
}
return sb.toString();
}
}
class Solution {
public String addBinary(String a, String b) {
int i=a.length()-1,j=b.length()-1;
if(i<0)
return b;
if(j<0)
return a;
char[] ret=new char[Math.max(i,j)+2];
int k=ret.length-1;
boolean addition=false;
while(i>=0 && j>=0)
{
if(a.charAt(i)=='1' && b.charAt(j)=='1')
{
if(addition)
ret[k]='1';
else
ret[k]='0';
addition=true;
}
else if((a.charAt(i)=='0' && b.charAt(j)=='1')||(a.charAt(i)=='1' && b.charAt(j)=='0'))
{
if(addition)
{
ret[k]='0';
addition=true;
}
else
ret[k]='1';
}
else
{
if(addition)
ret[k]='1';
else
ret[k]='0';
addition=false;
}
i--;j--;k--;
}
if(i>=0)
{
while(i>=0)
{
if(a.charAt(i)=='0')
{
if(addition)
ret[k]='1';
else
ret[k]='0';
addition=false;
}
else
{
if(addition)
{
ret[k]='0';
addition=true;
}
else
ret[k]='1';
}
i--;k--;
}
}
if(j>=0)
{
while(j>=0)
{
if(b.charAt(j)=='0')
{
if(addition)
ret[k]='1';
else
ret[k]='0';
addition=false;
}
else
{
if(addition)
{
ret[k]='0';
addition=true;
}
else
ret[k]='1';
}
j--;k--;
}
}
if(addition)
ret[0]='1';
else
ret[0]='0';
String s=new String(ret);
if(ret[0]=='1')
return s.substring(0,s.length());
else
return s.substring(1,s.length());
}
}
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1==null)
return l2;
if(l2==null)
return l1;
int len1=1,len2=1,temp=0;
ListNode p1=l1,p2=l2;
while(p1.next!=null)
{
p1=p1.next;
len1++;
}
while(p2.next!=null)
{
p2=p2.next;
len2++;
}
if(len1<len2)
{
p1=l2;
p2=l1;
temp=len1;
len1=len2;
len2=temp;
}
else
{
p1=l1;
p2=l2;
}
ListNode[] arr=new ListNode[len1+1];
arr[0]=new ListNode(0);
int i=1;
while(len1!=len2)
{
arr[i]=new ListNode(p1.val);
p1=p1.next;
len1--;
i++;
}
while(len1>0)
{
arr[i]=new ListNode(p1.val+p2.val);
i++;
p1=p1.next;
p2=p2.next;
len1--;
}
for(int j=arr.length-1;j>0;j--)
{
if(arr[j].val>=10)
{
arr[j-1].val+=1;
arr[j].val-=10;
}
}
if(arr[0].val!=0)
{
for(i=0;i<arr.length-1;i++)
{
arr[i].next=arr[i+1];
}
return arr[0];
}
else
{
for(i=1;i<arr.length-1;i++)
{
arr[i].next=arr[i+1];
}
return arr[1];
}
}
}
class Solution {
public static String multiply(String num1, String num2) {
int n1=num1.length(),n2=num2.length();
int[] result=new int[n1+n2];
for(int i=n1-1;i>=0;i--)
{
for(int j=n2-1;j>=0;j--)
{
int sum=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');
int m=i+j,n=m+1;
sum += result[n];
result[n]= (sum%10);
result[m]+= (sum/10);
}
}
StringBuilder ret=new StringBuilder();
int n=0;
while(n<result.length && result[n]==0)
n++;
if(n==result.length)
return "0";
for(;n<result.length;n++)
ret.append(result[n]);
return ret.toString();
}
}