高精度加、减、乘、除

算法模板

高精度加法
两个位数很多的正数相加

#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;
}

415. Add Strings

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();
    }
}

67. Add Binary

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());
    }
}

445. Add Two Numbers II

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];
		}
    }
}

43. Multiply Strings

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值