高精模板(加减乘)

啥都不说直接上板子吧 QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int N=100100;

int len;
int c[N],a[N],b[N];
string s,s1;

//高精加法
inline void add(int a[],int b[]) {
    int len=max(a[0],b[0]);
    for(int i=1;i<=len;++i) {
        c[i]=a[i]+b[i]+c[i];
        if(c[i]>=10) {
            c[i]%=10;
            ++c[i+1];
        }
    }
    if(c[len+1]!=0) len++;//最少有len位,最多有len+1位,判断一下有多少位
    for(int i=len;i>=1;--i) printf("%d",c[i]);
    memset(c,0,sizeof len+10);//清空
}

//高精减法

inline void sub(int a[],int b[],bool vis) {
    int len=a[0];
    for(int i=1;i<=len;++i) {
        if(a[i]<b[i]) {
            --a[i+1];
            a[i]+=10;
        }
        c[i]=a[i]-b[i];
    }
    if(vis) printf("-");
    while ((c[len]==0&&(len>1))) len--;
    for(int i=len;i>=1;--i) printf("%d",c[i]);
}

inline void sub_(int a[],int b[]) {
    if(a[0]>b[0]) sub(a,b,0);//判断一下谁大谁小
    if(a[0]<b[0]) sub(b,a,1);

    int len=a[0];
    if(a[0]==b[0]) {
        while (len) {
            if(a[len]>b[len]) {
                sub(a,b,0);
                break;
            }
            if(a[len]<b[len]) {
                sub(b,a,1);
                break;
            }
            len--;
        }
    }
    if(len==0) printf("0");//相等输出0
}

//高精乘法
inline void mul(int a[],int b[]) {
    for(int i=1;i<=a[0];++i) {
        int x=0;
        for(int j=1;j<=b[0];++j) {
            c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
            x=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
        c[i+b[0]]=x;
    }
    len=a[0]+b[0];
    while(c[len]==0&&len>1) --len;
    for(int i=len;i>=1;--i) printf("%d",c[i]);
}

//预处理
inline void init(string &x,int a[]) {
    a[0]=x.length();//string 应该是从string[0]开始存的吧
    for(int i=0;i<a[0];++i) a[a[0]-i]=x[i]-'0';
}

int main() {
    cin>>s>>s1;

    init(s,a);
    init(s1,b);

    add(a,b);//a+b
    printf("\n");

    mul(a,b);//a*b
    printf("\n");

    sub_(a,b);//a-b
    printf("\n");

    return 0;
}

原文地址:https://www.cnblogs.com/Darkpurple/p/9789993.html

时间: 2024-10-01 20:46:43

高精模板(加减乘)的相关文章

高精模板

#include <iostream> #include <string> #include <cstring> #include <cstdio> #include<algorithm> using namespace std; const int maxn = 1000; struct bign{ int d[maxn], len; void clean() { while(len > 1 && !d[len-1]) l

HDOJ1002-A + B Problem II(高精加)

Problem Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. Input The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines fol

【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. 每次取走的各个元素只能是该元素所在行的行首或行尾: 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素

高精-----各种模板

高精加法 代码 #include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[501],b[501]; int x[501],y[501],z[50000]; int main() { cin>>a; cin>

模板——高精系列

存放一下高精的模板 高精加: #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int a[1001],b[1001],c[1001],lena,lenb; char a1[1001],b1[1001]; int main(){ gets(a1); gets(b1); lena=strlen(a1); lenb=strlen

【模板】高精算法

利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度.我们可以利用程序设计的方法去实现这样的高精度计算.介绍常用的几种高精度计算的方法. 高精度计算中需要处理好以下几个问题: 1)数据的接收方法和存贮方法 数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中.另一种方法是直接用循环

c++普通高精加

//作为一名蒟蒻,还请诸位不要吐槽. //第一次打c++高精加,内心有点小激动. //为codevs3116 高精度练习之加法 //程序太简单,就不打注释了. #include<cstdio>#include<cstring>int main(){char s1[600],s2[600];int a1[600],a2[600],a3[600]={0},len1,len2,i;scanf("%s",s1);scanf("%s",s2);len1

qml 绘制高精地图之怀疑人生的加载速度

绘制高精地图时需要gps的经纬度坐标,之前的实现方式是QGeocoordinate类的经纬度变量通过json的方式在qml中使用. 以画线为例,使用方式是这样哒. 1 for(var i in vehicleMapProcess.laneMedian){ // 道路条数 2 var newMapLaneMedian = Qt.createQmlObject('import QtLocation 5.9;import QtPositioning 5.5; // 这里只画中线 3 MapPolyli

大数加减乘模板

大数加法: 1 #include <stdio.h> 2 3 #include <string.h> 4 5 #define M 100 //定义了数量M是100作为数组初始化的数量 6 7 8 9 int main() 10 11 { 12 13 int i, j, len_s1, len_s2; // len_s1是字符数组s1的长度, len_s2是字符数组s2的长度, 14 15 char s1[M], s2[M]; 16 17 int num1[M] = {0}; //