高精度加法,减法,乘法,除法

**高精度加法模板
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B)
{
    if(A.size()<B.size())  return add(B,A);
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t+=A[i];
        if(i<B.size()) t+=B[i];
        C.push_back(t%10);
        t/=10;
    }
    if(t)  C.push_back(t);
    return C;
}
int main()
{
    string a,b;
    vector<int> A,B;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
    auto C=add(A,B);
    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    return 0;
}

**1268 - 高精度加法
**来源:东方博宜oj  oj.czos.cn
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[500];
int main()
{
    cin>>s1>>s2;
    for(int i=0;i<s1.size();i++)  a[i]=s1[s1.size()-1-i]-'0';
    for(int i=0;i<s2.size();i++)  b[i]=s2[s2.size()-1-i]-'0';
    int len=max(s1.size(),s2.size());
    for(int i=0;i<len;i++)
    {
        c[i]=c[i]+a[i]+b[i];
        if(c[i]>=10)
        {
            c[i+1]=c[i+1]+c[i]/10;
            c[i]=c[i]%10;
        }
    }
    if(c[len]) len++;
    for(int i=len-1;i>=0;i--)
    {
        printf("%d",c[i]);
    }
    return 0;
}

**高精度减法
#include<bits/stdc++.h>
using namespace std;
//判断是否有A>=B
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;
}
vector<int> sub(vector<int> &A,vector<int> &B)
{
    vector<int> C;
    for(int i=0,t=0;i<A.size();i++)
    {
        t=A[i]-t;
        if(i<B.size()) t-=B[i];
        C.push_back((t+10)%10);
        if(t<0) t=1;
        else t=0;
    }
    //删除前导0
    while(C.size()>1&&C.back()==0) C.pop_back();
    return C;
}
int main()
{
    string a,b;
    vector<int> A,B;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
    if(cmp(A,B))
    {
        auto C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    }
    else
    {
        auto C=sub(B,A);
        printf("-");
        for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    }
    return 0;
}

** 1269 - 高精度减法 
** 来源:东方博宜oj  oj.czos.cn

*解法一:
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[250];
int len,p;
char f='+';
int main()
{
    cin>>s1>>s2;
    if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2))
    {
        f='-';
        swap(s1,s2);
    }
    for(int i=0;i<s1.size();i++) a[i]=s1[s1.size()-1-i]-'0';
    for(int i=0;i<s2.size();i++) b[i]=s2[s2.size()-1-i]-'0';
    len=s1.size();
    for(int i=0;i<len;i++)
    {
        if(a[i]<b[i])
        {
            a[i+1]=a[i+1]-1;
            a[i]=a[i]+10;
        }
        c[i]=a[i]-b[i];
    }
    if(f=='-') cout<<f;
    for(int i=len;i>=0;i--)
    {
        if(c[i])
        {
            p=i;
            break;
        }
    }
    for(int i=p;i>=0;i--)
    {
        cout<<c[i];
    }
    return 0;
}

*解法二:
#include<bits/stdc++.h>
using namespace std;
int a[250],b[250],c[250];
bool f=true;
string sub(string s1,string s2)
{
    for(int i=0; i<s1.size(); i++) a[i]=s1[s1.size()-1-i]-'0';
    for(int i=0; i<s2.size(); i++) b[i]=s2[s2.size()-1-i]-'0';
    int len=s1.size();
    for(int i=0; i<len; i++)
    {
        if(a[i]<b[i])
        {
            a[i+1]=a[i+1]-1;
            a[i]=a[i]+10;
        }
        c[i]=a[i]-b[i];
    }
    string s="";
    while(c[len]==0&&len>=0) len--;
    for(int i=0;i<=len;i++)
    {
        s=char(c[i]+'0')+s;
    }
    if(len==-1) s="0";
    return s;
}
int main()
{
    string s1,s2;
    cin>>s1>>s2;
    if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)) f=false;
    if(f) cout<< sub(s1,s2);
    else
    {
        printf("-");
        cout<< sub(s2,s1);
    }
    return 0;
}

**高精度乘法
#include<bits/stdc++.h>
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();
    return C;
}
int main()
{
    string a;
    int b;
    cin>>a>>b;
    vector<int> A;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    auto  C=mul(A,b);
    for(int i=C.size()-1;i>=0;i--) cout<< C[i];
    return 0;
}

** 1271 - 高精度整数除法
** 来源:东方博宜oj   oj.czos.cn

*解法一
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b,i,n,t;
    cin>>a>>b>>n;
    cout<<a/b<< ".";
    t=a%b;
    for(int i=1;i<=n;i++)
    {
        t=t*10;
        cout<<t/b;
        t=t%b;
    }
    return 0;
}

*解法二
#include<bits/stdc++.h>
using namespace std;
string div(int a,int b,int n)
{
    string s=to_string(a/b)+'.';
    int t=a%b;
    for(int i=0;i<n;i++)
    {
        t*=10;
        s+=char(t/b+'0');
        t%=b;
    }
    return s;
}
int main()
{
    int a,b,n;
    cin>>a>>b>>n;
    cout<<div(a,b,n);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的高精度除法C++代码示例: ```c++ #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 10010; // 数组的最大长度 const int BASE = 10; // 进制 struct BigInt { int len, s[MAXN]; BigInt() { memset(s, 0, sizeof(s)); len = 1; } BigInt(int num) { *this = num; } BigInt(const char* num) { *this = num; } BigInt operator = (int num) { char s[MAXN]; sprintf(s, "%d", num); *this = s; return *this; } BigInt operator = (const char* num) { memset(s, 0, sizeof(s)); len = strlen(num); for (int i = 0; i < len; i++) s[i] = num[len - 1 - i] - '0'; return *this; } string str() const { string res = ""; for (int i = 0; i < len; i++) res = (char)(s[i] + '0') + res; if (res == "") res = "0"; return res; } BigInt operator + (const BigInt& b) const { BigInt c; c.len = 0; for (int i = 0, g = 0; g || i < max(len, b.len); i++) { int x = g; if (i < len) x += s[i]; if (i < b.len) x += b.s[i]; c.s[c.len++] = x % BASE; g = x / BASE; } return c; } BigInt operator - (const BigInt& b) const { BigInt c; c.len = 0; for (int i = 0, g = 0; i < len; i++) { int x = s[i] - g; if (i < b.len) x -= b.s[i]; if (x >= 0) g = 0; else { g = 1; x += BASE; } c.s[c.len++] = x; } c.trim(); return c; } BigInt operator * (const BigInt& b) const { BigInt c; c.len = len + b.len; for (int i = 0; i < len; i++) for (int j = 0; j < b.len; j++) c.s[i + j] += s[i] * b.s[j]; for (int i = 0; i < c.len - 1; i++) { c.s[i + 1] += c.s[i] / BASE; c.s[i] %= BASE; } c.trim(); return c; } // 高精度除法 BigInt operator / (const BigInt& b) const { BigInt c; c.len = len - b.len + 1; for (int i = c.len - 1; i >= 0; i--) { BigInt t = b; if (*this < t * BigInt(BASE) * BigInt(i)) { c.s[i] = 0; continue; } int l = 0, r = BASE - 1, ans; while (l <= r) { int mid = (l + r) >> 1; if (*this >= t * BigInt(mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } c.s[i] = ans; *this = *this - t * BigInt(ans); } c.trim(); return c; } // 去掉前导0 void trim() { while (len > 1 && !s[len - 1]) len--; } // 判断大小 bool operator < (const BigInt& b) const { if (len != b.len) return len < b.len; for (int i = len - 1; i >= 0; i--) if (s[i] != b.s[i]) return s[i] < b.s[i]; return false; } bool operator > (const BigInt& b) const { return b < *this; } bool operator <= (const BigInt& b) const { return !(b < *this); } bool operator >= (const BigInt& b) const { return !(*this < b); } bool operator != (const BigInt& b) const { return b < *this || *this < b; } bool operator == (const BigInt& b) const { return !(b < *this) && !(*this < b); } }; ostream& operator << (ostream& out, const BigInt& x) { out << x.str(); return out; } istream& operator >> (istream& in, BigInt& x) { string s; in >> s; x = s.c_str(); return in; } int main() { BigInt a, b, c; cin >> a >> b; c = a / b; cout << c << endl; return 0; } ``` 该代码中定义了一个结构体`BigInt`,表示高精度整数。实现了加法、减法乘法除法操作。其中,高精度除法的实现是用二分法来找出商的每一位。 使用时只需要输入两个字符串,分别表示被除数和除数,然后调用`/`操作符即可得到商。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值