L'algorithme remet en question la pratique quotidienne --- Jour 81 : ajout de haute précision

Prenez l'habitude d'écrire ensemble ! C'est le 13ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .

1. Description du problème

Étant donné deux entiers positifs (sans zéros non significatifs), calculez leur somme.

dans, 1 Longueur entière 100000 1≤longueur entière≤100000

Lien vers le sujet : Ajout de haute précision .

Deuxièmement, les exigences du sujet

Exemple 1

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

Exemple 2

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

visiter

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

3. Analyse du problème

Le nombre de cette question est évidemment au-delà de la plage de toutes les mises en forme, nous pouvons utiliser la chaîne de stockage de chaîne, où la plage de stockage de la chaîne est : 1~65400个字符. Après avoir saisi la chaîne, nous devons calculer le nombre, de sorte que le type char-> int -'0'répond aux .

Nous utilisons un tableau pour stocker chaque chiffre. Avant le début officiel, nous réfléchissons à une question, est-elle stockée dans le sens direct ou dans le sens inverse ?

Par exemple, pour le numéro 75842, laquelle des méthodes de stockage suivantes doit être utilisée :

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

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

Utilisez certainement le second! Le premier, vous pouvez voir si la position la plus élevée peut avancer, puis ce sera -1.

Pour la règle d'addition, utilisez les bits correspondants appris à l'école élémentaire pour additionner et ajoutez 1 à 10 lorsqu'ils sont pleins.

Quatrièmement, la mise en œuvre de l'encodage

#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. Résultats des tests

1.png

Je suppose que tu aimes

Origine juejin.im/post/7086996262028836871
conseillé
Classement