高精度模板

来源:互联网 发布:软件公司员工保密协议 编辑:程序博客网 时间:2024/05/22 01:34

一.大整数结构体

struct BigInter{    int num[1001];};

二.输入函数

BigInter get(){    BigInter A;    memset(A.num,0,sizeof(A.num));//初始化为0    char s[10001];//注意使用时要根据实际情况来改变数组s的大小    scanf("%s",s);//输入    A.num[0] = strlen(s);//num[0]储存大整数的位数    for(int i = 1; i <= A.num[0]; i++)//将字符串转化为数字        A.num[i] = s[A.num[0] - i] - 48;    return A;//返回}

三.输出函数

void print(BigInter A){    if(A.num[0] == 0)//特判为0的情况    {        printf("0\n");        return;    }    for(int i = A.num[0]; i >= 1; i--)//逆序输出        printf("%d",A.num[i]);    printf("\n");    return;}

四.比较函数

int compare(BigInter A,BigInter B)//A大于B,返回1A等于B,返回0A小于B,返回-1{    if(A.num[0] > B.num[0])//先比较位数        return 1;    if(A.num[0] < B.num[0])        return -1;    for(int i = A.num[0]; i >= 1; i--)//如果位数相同,逆序比较每一位    {        if(A.num[i] > B.num[i])            return 1;        if(A.num[i] < B.num[i])            return -1;    }    return 0;//相等}

五.加法

BigInter add(BigInter A,BigInter B){    BigInter C;    memset(C.num,0,sizeof(C.num));//初始化为0    if(A.num[0] < B.num[0])//C.num[0]记录A,B中较大的位数        C.num[0] = B.num[0];    else        C.num[0] = A.num[0];    for(int i = 1; i <= C.num[0]; i++)        C.num[i] += A.num[i] + B.num[i];//对应的每位相加    for(int i = 1; i <= C.num[0]; i++)//处理进位    {        C.num[i + 1] = C.num[i + 1] + C.num[i] / 10;        C.num[i] = C.num[i] % 10;    }    if(C.num[C.num[0] + 1] > 0)//修正位数        C.num[0]++;    return C;//返回}

六.减法

BigInter subtract(BigInter A,BigInter B){    int comp = compare(A,B);//比较结果    if(comp == 0)//如果相等    {        A.num[0] = 0;//将位数赋为0,输出函数会为我们特判,然后输出0        return A;    }    else if(comp == 1)//如果A大于B    {        for(int i = 1; i <= A.num[0]; i++)//循环A的位数次        {            if(A.num[i] < B.num[i])//如果当前位A小于B            {                A.num[i + 1]--;//就从高位借1                A.num[i] = A.num[i] + 10;            }            A.num[i] = A.num[i] - B.num[i];//用A减去B,结果保存在A数组(大减小)        }        while(A.num[A.num[0]] == 0)//修正位数            A.num[0]--;        return A;//返回    }    else if(comp == -1)//如果A小于B    {        printf("-");//先打印一个负号        for(int i = 1; i <= B.num[0]; i++)//循环B的位数次        {            if(B.num[i] < A.num[i])//如果当前位B小于A            {                B.num[i + 1]--;//就从高位借1                B.num[i] = B.num[i] + 10;            }            A.num[i] = B.num[i] - A.num[i];//用B减去A,结果保存在A数组(大减小)        }        A.num[0] = B.num[0];//将B的位数赋给A        while(A.num[A.num[0]] == 0)//修正位数            A.num[0]--;        return A;//返回    }}

七.乘法

BigInter Multiply(BigInter A,BigInter B){    BigInter C;//局部变量    memset(C.num,0,sizeof(C.num));//初始化为0,非常重要!    C.num[0] = A.num[0] + B.num[0];//计算位数    for(int i = 1; i <= A.num[0]; i++)//模拟两数相乘的计算过程        for(int j = 1; j <= B.num[0]; j++)            C.num[i + j - 1] += A.num[i] * B.num[j];    for(int i = 1;i <= C.num[0]; i++)//处理进位    {        C.num[i + 1] += C.num[i] / 10;        C.num[i] %= 10;    }    while(C.num[0] > 0 && C.num[C.num[0]] == 0)//修正位数        C.num[0]--;    return C;}


PS:可以轻松地转换为R进制高精度
若定义为局部变量,那么一定别忘了初始化

原创粉丝点击