高精度算法模板

高精度加1

#include <stdio.h>
#include <string.h>
int main()
{
    char a[310], b[310];
    int c[310], d[310], e[310];
    scanf("%s %s", a, b);
    int x = strlen(a), y = strlen(b);
    for (int i = 0; i < x; i++) {
        c[x-1-i] = a[i] - '0';
    }
    for (int i = 0; i < y; i++) {
        d[y-1-i] = b[i] - '0';
    }
    int l = (x > y) ? x : y;
    memset(e, 0, sizeof(e));
    for (int i = 0; i < l; i++) {
        e[i] += c[i] + d[i];
        if(e[i] > 9) e[i] -= 10,e[i+1] = 1;
    }
    if(e[l]) l++;
    for(int i = l-1; i >= 0; i--) printf("%d", e[i]);
    printf("\n");
    return 0;
}

高精度减法

#include <cstdio>
#include <cstring>
using namespace std;
 
const int maxn = 300 + 5;
 
int main(int argc, char **argv) {
    int a[maxn], b[maxn], c[maxn];
    char s1[maxn], s2[maxn];
    char *ss1 = s1, *ss2 = s2;
    memset(a, 0, sizeof(a) );
    memset(b, 0, sizeof(b) );
    memset(c, 0, sizeof(c) );
 
    scanf("%s%s", s1, s2);
    if( strlen(s1)<strlen(s2) || (strlen(s1)==strlen(s2)&&strcmp(s1,s2)<0) ){
        ss1 = s2;
        ss2 = s1;
        printf("-");
    }else if( !strcmp(s1,s2) ){
        printf("0");
        return 0;
    }
    int len1 = strlen(ss1);
    int len2 = strlen(ss2);
    for( int i=0; i<len1; i++ )
        a[len1-1-i] = ss1[i]-'0';
    for( int i=0; i<len2; i++ )
        b[len2-1-i] = ss2[i]-'0';
    int j;
    for( j=0; j<len1||j<len2; j++ ){
        c[j] += a[j]-b[j];
        if( c[j]<0 ){
            c[j] += 10;
            c[j+1] --;
        }
    }
    int lenc = j;
    for( ; lenc>=0 && !c[lenc]; lenc-- );
    for( ; lenc>=0; lenc-- )
        printf("%d", c[lenc]);
    /*scanf("%s%s", s1, s2);
    printf("%d", strcmp(ss1, ss2));*/
 
    return 0;
}

高精度乘法

#include<cstdio>
#include<cstring>
using namespace std;
 
char a1[55],b1[55];
int a[55],b[55],c[125];
 
int main(){
    scanf("%s%s",a1,b1);
    int lena=strlen(a1);
    int lenb=strlen(b1);
    for(int i=1;i<=lena;i++)
        a[i]=a1[lena-i]-'0';
    for(int i=1;i<=lenb;i++)
        b[i]=b1[lenb-i]-'0';
    for(int i=1;i<=lena;i++){
        int x=0;
        for(int j=1;j<=lenb;j++){
            c[i+j-1]+=a[i]*b[j]+x;
            x=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
        c[i+lenb]=x;
    }
    int lenc=lena+lenb;
    while(c[lenc]==0&&lenc>1)
        lenc--;
    while(lenc)
        printf("%d",c[lenc--]);
    return 0;
}

高精乘除单精法

#include<stdlib.h>
#include<stdio.h>
char s[501],ch;
int a[501],b,ka,k=0;
void f()
{
     int i,c=0;
     for(i=0;i<k;i++)
     {
         a[i]=a[i]*b+c;
         if(a[i]>=10)
         {
            c=a[i];
            a[i]=a[i]%10;
            c=c/10;
         }else c=0;
     }
     if(c!=0) printf("%d",c);
     for(i=k-1;i>=0;i--)
     printf("%d",a[i]);
}
void x()
{
     int d=0,i,c;
     for(i=k-1;i>=0;i--)
     {
         c=a[i]+d*10;
         a[i]=(a[i]+d*10)/b;
         d=c%b;
     }
     while((a[k-1]==0)&&(k>0)) k--;
     for(i=k-1;i>=0;i--)
      printf("%d",a[i]);
     if(d!=0)
      printf("---%d",d);
}
int main()
{
    int i,temp;
    scanf("%s",s);
    while((s[k]!='*')&&(s[k]!='/'))
    {
        a[k]=s[k]-'0';
        k++;
    }
    ch=s[k];
    b=s[strlen(s)-1]-'0';
    ka=k;//读入
    for(i=0;i<(ka>>1);i++)
    {
        temp=a[i];
        a[i]=a[ka-1-i];
        a[ka-1-i]=temp;
    }
    if(ch=='*') f(); else x();
    system("pause");
    return 0;
}
高精度算法是指能够处理超出计算机基本数据类型范围的数字运算问题的算法。常见的高精度算法有大整数加减乘除、高精度开方、高精度取模等。 以下是acwing的高精度算法模板: 1. 大整数加法 C++ 代码: vector<int> add(vector<int> &A, vector<int> &B) { vector<int> C; 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]; C.push_back(t % 10); t /= 10; } if (t) C.push_back(1); return C; } 2. 大整数减法 C++ 代码: 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; } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } 3. 大整数乘法 C++ 代码: 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; } return C; } vector<int> mul(vector<int> &A, vector<int> &B) { vector<int> C(A.size() + B.size(), 0); for (int i = 0; i < A.size(); i++) { int t = 0; for (int j = 0; j < B.size() || t; j++) { if (j < B.size()) t += A[i] * B[j]; t += C[i + j]; C[i + j] = t % 10; t /= 10; } } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } 4. 大整数除法 C++ 代码: int cmp(vector<int> &A, vector<int> &B) { if (A.size() != B.size()) return A.size() < B.size() ? -1 : 1; for (int i = A.size() - 1; i >= 0; i--) { if (A[i] != B[i]) return A[i] < B[i] ? -1 : 1; } return 0; } vector<int> div(vector<int> &A, int b, int &r) { vector<int> C; r = 0; for (int i = A.size() - 1; i >= 0; i--) { r = r * 10 + A[i]; C.push_back(r / b); r %= b; } reverse(C.begin(), C.end()); while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } vector<int> div(vector<int> &A, vector<int> &B) { vector<int> C; for (int i = A.size() - 1; i >= 0; i--) { C.insert(C.begin(), A[i]); while (cmp(C, B) >= 0) { vector<int> t = sub(C, B); C = t; } } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } 5. 高精度开方 C++ 代码: int cmp(vector<int> &A, vector<int> &B) { if (A.size() != B.size()) return A.size() < B.size() ? -1 : 1; for (int i = A.size() - 1; i >= 0; i--) { if (A[i] != B[i]) return A[i] < B[i] ? -1 : 1; } return 0; } vector<int> sqrt(vector<int> &A) { vector<int> C; if (A.size() % 2 == 1) A.push_back(0); for (int i = A.size() - 2; i >= 0; i -= 2) { int res = 0; for (int j = 9; j >= 0; j--) { vector<int> t = mul(C, 20); t.push_back(j * j); if (cmp(t, A) <= 0) { res = j; C.push_back(j); break; } } } reverse(C.begin(), C.end()); while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } 6. 高精度取模 C++ 代码: int mod(vector<int> &A, int b) { int r = 0; for (int i = A.size() - 1; i >= 0; i--) { r = r * 10 + A[i]; r %= b; } return r; } vector<int> mod(vector<int> &A, vector<int> &B) { vector<int> C; for (int i = A.size() - 1; i >= 0; i--) { C.insert(C.begin(), A[i]); while (cmp(C, B) >= 0) { vector<int> t = sub(C, B); C = t; } } return C; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值