Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

指定した制約のもとで2つの配列の要素を加算するには?

この問題では、2つの配列の要素を加算する際に特定の制約が設けられており、その制約に基づいて加算結果の格納方法が変わります。2つの配列 a[] と b[] の対応する要素同士の合計を、3つ目の配列 c[] に格納していきます。ただし、格納される各要素は必ず1桁の数値でなければならず、もし合計が2桁以上になった場合は、その数値を桁ごとに分割して個別の要素として格納します。例えば、ある要素の合計が27となった場合、3つ目の配列には「2」と「7」という2つの要素として保存されます。

Input: a[] = {1, 2, 3, 7, 9, 6}
       b[] = {34, 11, 4, 7, 8, 7, 6, 99}
Output: 3 5 1 3 7 1 4 1 7 1 3 6 9 9

アルゴリズムの解説

まず出力用の配列を用意し、両方の入力配列の0番目のインデックスからループ処理を開始します。ループの各反復では、両方の配列から次の要素をそれぞれ取り出して加算します。合計が9以下であれば、その値をそのまま出力配列に追加します。一方、合計が10以上の場合は、合計値を桁ごとに分解し、各桁の数字を順番に出力配列へ追加します。共通部分の処理が終わった後、要素数が多い方の配列に残っている要素についても同様に桁分割を行いながら、すべて出力配列へ追加します。

実装例(C++)

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
void split(int n, vector<int> &c) {
    vector<int> temp;
    while (n) {
       temp.push_back(n%10);
       n = n/10;
    }
    c.insert(c.end(), temp.rbegin(), temp.rend());
}
void addArrays(int a[], int b[], int m, int n) {
    vector<int> out;
    int i = 0;
    while (i < m && i < n) {
       int sum = a[i] + b[i];
       if (sum < 10) {
          out.push_back(sum);
       } else {
          split(sum, out);
       }
       i++;
    }
    while (i < m) {
       split(a[i++], out);
    }
    while (i < n) {
       split(b[i++], out);
    }
    for (int x : out)
    cout << x << " ";
}
int main() {
    int a[] = {1, 2, 3, 7, 9, 6};
    int b[] = {34, 11, 4, 7, 8, 7, 6, 99};
    int m =6;
    int n = 8;
    addArrays(a, b, m, n);
    return 0;
}
  1. C++で指定された制約を満たす行列内の最長パスを検索する方法

    n次の正方行列を考えます。この行列にはすべて異なる要素が含まれています。ここで、パス上のすべてのセルが差1で増加順に並ぶような最長パスを求める必要があります。あるセルからは、左・右・上・下の4方向に移動できます。例えば、次のような行列があるとします。129538467この場合の出力は 4 になります。最長パスは 6→7→8→9 となるためです。解法のアプローチこの問題を解くためには、次の考え方に従います。まず、すべてのセルから始まる最長パスを計算します。すべてのセルについて最長パスが求まったら、その中の最大値を返します。このアプローチで重要なポイントは、多くの重複する部分問題が存在することです

  2. C++で配列内の重複しない(一意な)要素の合計を求める方法

    問題の概要いくつかの要素を含む配列 A があるとします。この配列から、すべての一意な(重複しない)要素の合計を求める必要があります。例えば、配列が A = [5, 12, 63, 5, 33, 47, 12, 63] の場合を考えてみましょう。このとき、一意な要素は「5, 12, 63, 33, 47」であり、その合計は 160 になります。重複している要素は、一度合計に加算された後は単純に無視されます。解決のアプローチこの問題は、C++の unordered_set(ハッシュセット)を使うことで効率的に解決できます。基本的な考え方は以下のとおりです。forループを1回だけ実行して配列を走査す