アルゴリズムは毎日の練習に質問します---81日目:高精度の加算

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して13日目です。クリックしてイベントの詳細をご覧ください

1.問題の説明

2つの正の整数(先行ゼロなし)が与えられた場合、それらの合計を計算します。

の、 1 整数の長さ 100000 1≤整数の長さ≤100000

トピックリンク:高精度加算

第二に、主題の要件

例1

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

例2

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

訪問

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

3.問題分析

この質問の数は明らかにすべてのシェーピングの範囲を超えています。文字列のストレージ範囲は次のとおりです。文字列文字列ストレージを使用できます1~65400个字符文字列を入力した後、数値を計算する必要があるため、char->int型は。を介し-'0'て要件を満たし。

配列を使用して各桁を格納します。公式の開始前に、質問について考えます。それは順方向に格納されますか、それとも逆方向に格納されますか?

たとえば、番号75842の場合、次のストレージ方法のどれを使用する必要がありますか。

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

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

間違いなく2番目のものを使用してください!1つ目は、最も高い位置が前方に移動できるかどうかを確認できます。その後、-1になります。

足し算のルールは、小学校で学んだ対応するビットを使って足し算し、いっぱいになったら1から10を足します。

第四に、エンコーディングの実装

#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.テスト結果

1.png

おすすめ

転載: juejin.im/post/7086996262028836871