【C++】henuACM暑期培训Day13 高精度运算

大整数加法

int 可以储存十位正负数字,double是15位,longlong也只有19位,这时候要是输入一个成百上千位的数字进行运算,就需要用到大整数。方法是把每个数都保存在数组中,比如保存一个二百位的整数,我们可以用一个a[200]来保存,让a[0]保存各位,a[1]存十位……

至于如何相加,就是用模拟列竖式做加法,从个位开始逐位相加,超过或达到10则进位。

先写出来一般的思路代码

#include <stdio.h>
#include <string.h>
#define MAX_LEN 200//二百位以内的大整数
int an1[MAX_LEN+10];//an是用来保存输入的字符转换成的数字
int an2[MAX_LEN+10];
char szLine1[MAX_LEN+10];//szline是用来保存输入的字符
char szLine2[MAX_LEN+10];
int main(void)//这个void是main函数不需要传入参数的标准写法,在Linux下都是这样写的
{
    
    
    scanf("%s", szLine1);
    scanf("%s", szLine2);
    int i, j;
    memset( an1, 0, sizeof(an1));
    memset( an2, 0, sizeof(an2));
int nLen1 = strlen( szLine1);
    for( j = 0, i = nLen1 - 1;i >= 0 ; i --)
        an1[j++] = szLine1[i] - '0';//输入的数字字符减去字符0,就可以得到字符对应的数字
    int nLen2 = strlen(szLine2);
    for( j = 0, i = nLen2 - 1;i >= 0 ; i --)
        an2[j++] = szLine2[i] - '0';
    for( i = 0;i < MAX_LEN ; i ++ )
    {
    
      an1[i] += an2[i]; //逐位相加
        if( an1[i] >= 10 )
        {
    
     //看是否要进位
            an1[i] -= 10;//进位后要减去10
            an1[i+1] ++; //进位
        }
    }
    for( i = MAX_LEN; (i >= 0) && (an1[i] == 0); i -- ) ;//这里其实还没有搞懂
    if(i>=0)
        for( ; i >= 0; i--)
            printf("%d", an1[i]);
    else      printf("0");
    return 0;
}

以上是实现两个大数字相加的代码,而在之后的新生练习赛上出了一个多组数据相加,到那一课的题解时讲。

大整数减法

小时候学加减法的时候都能感受到其实减法可以说只是加法的升级而已,因为会出现正负的问题,在大整数减法中,用一个变量来存储符号位,然后另一个数组存储差的绝对值。

下面这个代码片段是表示存储符号位的,为了表示清楚AB是什么,把main函数前面的定义也copy过来了

int main()
{
    
    
    char A[maxn];
    char B[maxn];
    scanf("%s%s",&A,&B);
    if(strlen(A)<strlen(B)||(strlen(A)==strlen(B)&&strcmp(A,B)<0))
    {
    
    
        swap(A,B);//交换
        printf("-");
    }

和大整数加法一样的是,输入的都是字符而不是以数字储存,所以还要定义两个数组用来存储减掉0的数字。

而在这个减法运算中,由于没有加法来的那么直观,学长新定义了一个数组c,用来存储得到的结果。

减法中最大的问题在于前导零,如123 - 120 答案是3,而不是003 。这是去掉前导零的代码。

 if(c[num]==0){
    
    num--;}
        for(int i=num;i>=0;--i){
    
    
            cout<<c[i];
        }

其中num是表示c的位数

完整代码如下:

#include <iostream>
#include <string.h>
using namespace std;
const int maxx = 10005;
int main()
{
    
    
    char A[205],B[205];
    cin>>A>>B;
    if(strlen(A)<strlen(B) || (strlen(A)==strlen(B) && strcmp(A,B)<0) )
    {
    
    
        swap(A,B);
        cout<<"-";
    }
    int a[205],b[205];
    int lena = strlen(A);
    int lenb = strlen(B);
    for(int i=0;i<lena;++i){
    
    
        a[i] = A[lena-i-1]-'0';
    }
    for(int i=0;i<lenb;++i){
    
    
        b[i] = B[lenb-i-1]-'0';
    }
    int c[205];
    int num=0;
    for(int i=0,g=0;i<lena;++i){
    
    
        int tmp = a[i]-g;
        if(i<lenb){
    
    
            tmp =tmp-b[i];
        }
        if(tmp>=0){
    
    
            g=0;
        }
        else{
    
    
            g=1;
            tmp = tmp+10;
        }
        c[num]=tmp;
        num++;
    }
    num = num-1;
    if(c[num]==0){
    
    num--;}
        for(int i=num;i>=0;--i){
    
    
            cout<<c[i];
        }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44899247/article/details/97622808