高精度加减乘法

高精度的加法

#include<bits/stdc++.h>
#define MAXN 10000000
using namespace std;
    
string a,b;
int na[MAXN],nb[MAXN],ans[MAXN];
int main()
{
    cin>>a>>b;
    for(int i = a.size() ; i > 0 ; i--)na[i] = a[a.size() - i ] - '0';
    for(int i = b.size() ; i > 0 ; i--)nb[i] = b[b.size() - i ] - '0';
    int maxl = max(a.size(), b.size())+1;//由于加法可能最高位会向前进位,所以应该开辟比最高位还大1位的数组
    int pw = 0;//定义一个变量去记录每次后一位进位
    for(int i = 1 ; i < maxl ; i++)
    {
        ans[i] += pw;//先加上前一位进位的1,如果没进位加0不影响
        pw = 0;//每次进位完都应该将pw清0
        if(ans[i] + na[i] + nb[i] >= 10)
        {
            pw = 1;
            na[i] -= 10;
        }
        ans[i] += na[i] + nb[i];
    }
    if(pw==1)
    ans[maxl]=1;
    while(ans[maxl] == 0)maxl--;
    for(int i = maxl ; i > 0 ; i--)cout<<ans[i];
    if(maxl < 1)cout<<"0";
    return 0;
}

高精度的减法

#include<bits/stdc++.h>
#define MAXN 10500
using namespace std;
    
string a,b;//因为是高精度计算所以输入的数据可能很大,所以需要用字符串代替整形输入。
int na[MAXN],nb[MAXN],ans[MAXN];
bool pd;
int main()
{
    cin>>a>>b;
    if((a < b && a.size() == b.size())|| a.size() < b.size())//因为减法如果a的值比b小的话就会输出负数,我们可以先判断a和b的大小,用一个bool去记录大小,再用大的减小的,等最后算完了再根据bool的数值去                                                                                                                       //选择是否添加‘-’号。判断哦a,b大小时,应该判断当a,b长度相同时的a,b的字典值大小,判断不同长度的a,b可以直接知道长度大的自然值更大。
   {
        swap(a , b);当a<b时 ,交换a,b,否则不进入if语句。
        pd = true; //记录为负数
    }
    for(int i = a.size() ; i > 0 ; i--)na[i] = a[a.size() - i ] - '0';//倒序输入可以使尾部对齐,因为高精度的本质是竖式运算,要从个位开始算起。
    for(int i = b.size() ; i > 0 ; i--)nb[i] = b[b.size() - i ] - '0';
    int maxl = max(a.size(), b.size());
    for(int i = 1 ; i <= maxl ; i++)
    {
        if(na[i] < nb[i])//当同一位的数不够减时,应像竖式运算一样向上一位借1
        {
            na[i + 1]--;//此时上一位应该减1
            na[i] += 10;//下一位应该加10
        }
        ans[i] = na[i] - nb[i];
    }
    while(ans[maxl] == 0)maxl--;当有前导0时需去掉
    if(pd ==true)cout<<"-";
    for(int i = maxl ; i > 0 ; i--)cout<<ans[i];倒序输出
    if(maxl < 1)cout<<"0";
    return 0;
}

高精度乘法

#include<iostream>
#include<string>
using namespace std;
const int maxn = 1e5+5;
int main()
{
    string s1,s2;
    cin>>s1>>s2;
    int a[maxn],b[maxn];
    int n=s1.size();
    int m=s2.size();
    for(int i = 0 , j = n - 1 ; i < n ; i++ , j--)
    {
        a[i] = s1[j] - '0';
    }
    for(int i = 0 , j = m - 1 ; i < m ; i++ , j--)
    {
        b[i] = s2[j] - '0';
    }
    int c[maxn];
    for(int i = 0 ; i <  n ; i++)
    {
        for(int j = 0 ; j < m ; j++)

        {

            c[i + j] += a[i] * b[j];
        }
    }


    for(int i = 0 ; i < n + m ; i++)
    {
        if(c[i] >= 10)
        {
            c[i+1] += c[i]/10;//将每一个c[i]里的数的除个位以外的除以10向前进位
            c[i] %= 10;//将每一个c[i]的除个位以外的数去除,即c[i]%10,将个位的数保留
        }
    }
    int maxl = n + m;
    while(c[maxl]==0)maxl--;
    if(maxl<1)cout<<'0';
    else
    for(int i = maxl ; i >= 0 ; i--)
    {
        cout<<c[i];
    }
    return 0;
}

posted @   ganl啦  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示