Práctica diaria de preguntas de algoritmo --- Día 81: Adición de alta precisión

¡Acostúmbrate a escribir juntos! Este es el día 13 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

1. Descripción del problema

Dados dos números enteros positivos (sin ceros a la izquierda), calcule su suma.

en, 1 longitud entera 100000 1≤longitud entera≤100000

Enlace temático: Adición de alta precisión .

En segundo lugar, los requisitos de la materia.

Ejemplo 1

输入: 12    23
输出: 35
复制代码

Ejemplo 2

输入: 123  98
输出: 221
复制代码

visitar

1.高精度
2.建议用时15~30min
复制代码

3. Análisis de problemas

El número de esta pregunta obviamente está más allá del rango de todas las formas, podemos usar el almacenamiento de cadena de cadena, donde el rango de almacenamiento de la cadena es: 1~65400个字符. Después de ingresar a través de la cadena, necesitamos calcular el número, por lo que el tipo char->int -'0'cumple con los .

Usamos una matriz para almacenar cada dígito.Antes del inicio oficial, pensamos en una pregunta, ¿se almacena en la dirección hacia adelante o en la dirección inversa?

Por ejemplo, para el número 75842, cuál de los siguientes métodos de almacenamiento se debe utilizar:

下标:0 1 2 3 4
数字:7 5 8 4 2

下标:4 3 2 1 0
数字:7 5 8 4 2
复制代码

¡Definitivamente usa el segundo! El primero, puede ver si la posición más alta puede avanzar, y luego será -1.

Para la regla de la suma, use los bits correspondientes aprendidos en la escuela primaria para sumar y sume del 1 al 10 cuando esté lleno.

En cuarto lugar, la implementación de la codificación.

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
vector<int> add(vector<int> &a, vector<int> &b)  
{
    int i,k=0;//初始进位为0
    vector<int>c;
    for(i=0;i<a.size()||i<b.size();i++)//在范围内
    {
        if(i<a.size()) k+=a[i];
        if(i<b.size()) k+=b[i];
        c.push_back(k%10);//%10添加
        k=k/10;//进位
    }
    if(k)//确保遗留的进位添加进去
       c.push_back(k); 
    return c;
}
int main()
{
    string s1,s2;//字符串存储
    int i;
    cin>>s1>>s2;
    vector<int>a,b,c;
    for(i=s1.size()-1;i>=0;i--)//字符串转数字,倒序存储
        a.push_back(s1[i]-'0');
    for(i=s2.size()-1;i>=0;i--)//字符串转数字,倒序存储
        b.push_back(s2[i]-'0');
    c=add(a, b);//加法法则
    for (i=c.size()-1;i>=0;i--)//输出结果
        cout<<c[i];
    return 0;
}
复制代码

5. Resultados de la prueba

1.png

Supongo que te gusta

Origin juejin.im/post/7086996262028836871
Recomendado
Clasificación