[C ++] henuACM Summer Training Day13 informática de alta precisión

Suma de números enteros grandes

Int puede almacenar diez números positivos y negativos, double son 15 dígitos y longlong solo 19. En este momento, si ingresa un número con cientos o miles de dígitos para el cálculo, debe usar números enteros grandes. El método es guardar cada número en una matriz. Por ejemplo, para guardar un entero de doscientos dígitos, podemos usar un [200] para guardar, dejar que un [0] guarde a todos, un [1] guardar diez dígitos ...

En cuanto a cómo sumar, es utilizar la columna analógica tipo vertical para hacer la suma, partiendo del dígito de las unidades y sumando bit a bit, y si supera o llega a 10, se realizará.

Escriba primero el código de la idea general

#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;
}

Lo anterior es el código para sumar dos números grandes, y en la próxima competencia de práctica de primer año, se agrega un grupo de datos, que se explicarán cuando se resuelva el problema en esa lección.

Resta de números enteros grandes

Cuando era niño, aprendí la suma y la resta. De hecho, se puede decir que la resta es solo una mejora de la suma, porque habrá problemas positivos y negativos. En la resta de números enteros grandes, una variable se usa para almacenar el bit de signo y otra matriz almacena la diferencia. Valor absoluto.

El siguiente fragmento de código representa el almacenamiento del bit de signo. Para mostrar claramente qué es AB, también se copia la definición delante de la función principal.

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("-");
    }

Al igual que la suma de números enteros grandes, la entrada son todos caracteres en lugar de números, por lo que se deben definir dos matrices para almacenar los números menos 0.

En esta operación de resta, dado que no es tan intuitivo como la suma, el estudiante de último año definió una matriz c para almacenar el resultado.

El mayor problema en la resta es el cero inicial, como 123-120, la respuesta es 3, no 003. Este es el código para eliminar los ceros iniciales.

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

Donde num es el número de bits que representan c

El código completo es el siguiente:

#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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44899247/article/details/97622808
Recomendado
Clasificación