当前位置: 首页 > article >正文

再次学习高精度

高精度加法

需要注意不能返回string&,不能返回vector&
接收的类型必须是string和vector,不能使用&进行接收

#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

string Add(string& a,string& b)
{
    string ans;
    int t=0;
    for(int i=0;i<max(a.size(),b.size())|| t; i++)
    {
        if(i<a.size()) t+=a[i]-'0';
        if(i<b.size()) t+=b[i]-'0';
        ans+=t%10+'0';
        t/=10;
    }
    reverse(ans.begin(),ans.end());
    return ans;
}
int main()
{
    string a,b;
    cin>>a>>b;
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    
    string ans=Add(a,b);
    cout<<ans<<endl;
    
    return 0;
}
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

vector<int> Add(vector<int>& a,vector<int>& b)
{
    vector<int> c;
    int t=0;
    for(int i=0;i<max(a.size(),b.size());i++)
    {
        if(i<a.size()) t+=a[i];
        if(i<b.size()) t+=b[i];
        c.push_back(t%10);
        t/=10;
    }
    reverse(c.begin(),c.end());
    return c;
}
int main()
{
    string a,b;
    cin>>a>>b;
    vector<int> c,d;
    for(int i=a.size()-1;~i;i--) c.push_back(a[i]-'0');
    for(int j=b.size()-1;~j;j--) d.push_back(b[j]-'0');
    
    vector<int> ans=Add(c,d);
    
    for(auto n:ans)
        printf("%d",n);
    
    return 0;
}

高精度减法

一定要先判断a,b的大小,如果是a小于b,用大减小然后加±号

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

string sub(string& a,string& b)
{
    //a>=b
    string c;
    int t=0;//记录借位  
    
    int flag=0;//记录是否为负数
    for(int i=0;i<a.size();i++)
    {
        int tem=-t;
        tem+=(a[i]-'0');
        if(i<b.size()) tem-=b[i]-'0'; 
        if(tem<0) t=1;
        else t=0;
        c+=(tem+10)%10+'0';
    }
    while(c.size()>1 && c.back()=='0') c.pop_back();
    
    reverse(c.begin(),c.end());
    return c;
}
bool cmp(string& a,string& b)
{
    if(a.size()==b.size())
    {
        for(int i=0;i<a.size();i++)
            if(a[i]!=b[i]) return a[i]>b[i];
        return true;
    }
    return a.size()>b.size();
}
int main()
{
    string a,b;
    cin>>a>>b;
    //先判断大小
    //如果是边计算便判断大小,那就不符合计算规则了
    //计算规则是从个位开始加减,如果a是小于b的,需要用大减小
    //不论怎么实现都是需要进行这一步操作的
    char c='+';
    if(!cmp(a,b)) 
    {
        string tem=a;
        a=b;
        b=tem;
        c='-';
    }
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());

    string ans=sub(a,b);
    if(c=='-') printf("-");
    cout<<ans<<endl;
    return 0;
}

高精度乘法

小心12345678*0这种情况,这种情况会出现n个0的情况,我们需要将这些0进行删除
并且要注意string转int需要减去‘0’

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

vector<int> mul(vector<int>& a,int b)
{
    vector<int> c;
    
    int t=0;//记录总和
    for(int i=0;i<a.size()||t;i++)
    {
        if(i<a.size()) t+=a[i]*b;
        c.push_back(t%10);
        t/=10;
    }
    while(c.size()>1 && c.back()==0) c.pop_back();
    reverse(c.begin(),c.end());
    return c;
}

int main()
{
    string a;
    int b;
    cin>>a>>b;
    vector<int> c;
    for(int i=a.size()-1;~i;i--) c.push_back(a[i]-'0');
    
    auto ans=mul(c,b);
    for(auto u:ans)
        printf("%d",u);
    
    return 0;
}

高精度除法

#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;

typedef pair<vector<int>,int> PVI;

PVI div(vector<int>& a,int b)
{
    vector<int> c;
    int t=0;
    for(int i=0;i<a.size();i++)
    {
        t=t*10+a[i];
        c.push_back(t/b);
        t%=b;
    }
    reverse(c.begin(),c.end());
    while(c.size()>1 && c.back()==0) c.pop_back();
    reverse(c.begin(),c.end());
    PVI ans({c,t});

    return ans;
}

int main()
{
    string a;
    int b;
    cin>>a>>b;
    vector<int> c;
    for(int i=0;a[i];i++) c.push_back(a[i]-'0');

    auto ans=div(c,b);
    for(auto u:ans.first)
        printf("%d",u);
    cout<<endl<<ans.second<<endl;

    return 0;
}

http://www.kler.cn/a/132585.html

相关文章:

  • LeetCode 2816.翻倍以链表形式表示的数字
  • Nacos 配置中心变更利器:自定义标签灰度
  • 实用教程:如何无损修改MP4视频时长
  • 【Pytorch】IPython库中的display函数
  • 使用 Python 和 Py2Neo 构建 Neo4j 管理脚本
  • Ubuntu 的 ROS 操作系统 turtlebot3 导航仿真
  • Vue3-ref、reactive函数的watch
  • LeetCode 面试题 16.22. 兰顿蚂蚁
  • PaddlePaddle:开源深度学习平台
  • React父组件怎么调用子组件的方法
  • c语言免杀火绒
  • centos7 网卡聚合bond0模式配置
  • vs2017打开工程提示若要解决此问题,请使用以下选择启动 Visual Studio 安装程序: 用于 x86 和 x64 的 Visual C++ MFC
  • Buildroot 添加 Qt 支持
  • 2023.11.18 - hadoop之zookeeper分布式协调服务
  • JVM——运行时数据区(程序计数器+栈)
  • django理解02 前后端分离中的问题
  • 栈和队列的初始化,插入,删除,销毁。
  • 详谈动态规划问题并解最大子数组和
  • 构建自定义ChatGPT,微软推出Copilot Studio
  • 使用 `spring-statemachine-redis` 实现状态机
  • Xrdp+Cpolar实现远程访问Linux Kali桌面
  • SecureCRT 9.4.2 for Mac
  • 【数据结构】图的存储结构(邻接矩阵)
  • 云计算的发展趋势
  • JVM虚拟机:CMS垃圾回收器的日志分析