C++で多数を等しい合計の2つ以上のセグメントに分割できるかどうかを確認します
ここでは、数値を同じ合計で複数のセグメントに分割できるかどうかを確認できるプログラムを確認します。数値が74325のようなものであるとすると、これは3つの部分(7)、(4、3)、(2、5)に分割でき、すべて同じum値になります。
この問題を解決するには、次の手順に従う必要があります。
- 数字を文字列として取ります
- 配列を使用して、配列のプレフィックス合計を保持します
- これで、2番目の要素から最後の要素に移動し、最初のセグメントは0からi-1になり、その合計はprefix_sum[i-1]に配置されます
- 1からnまでトラバースする別の変数を使用してから、合計を加算し続けます。
- 合計値がいずれかの段階でprefix_sum[i– 1]と同じである場合、セグメントの合計は最初の値と等しくなります。
- セグメント合計値を0に再初期化してから、ポインターを動かし続けます。
- いずれかの段階でセグメントの合計がprefix_sum[i– 1]より大きい場合は、ループを中断します
- 最後の宛先に到達し、最後のセグメントの合計が最初のセグメントの合計と同じである場合、それを等しい合計のセグメントに分割できます。
例
#include <iostream> using namespace std; bool canBeSegmented(string str) { int n = str.length(); int prefix_sum[n]; prefix_sum[0] = str[0] - '0'; for (int i = 1; i < n; i++) { prefix_sum[i] = prefix_sum[i - 1] + (str[i] - '0'); } for (int i = 1; i <= n - 1; i++) { int sum = prefix_sum[i - 1]; int prev_sum = 0; int it = i; bool flag = false; while (it < n) { prev_sum += str[it] - '0'; if (prev_sum == sum) { prev_sum = 0; flag = true; } else if (prev_sum > sum) { break; } it++; } if (prev_sum == 0 && it == n && flag) { return true; } } return false; } int main() { string s = "74325"; if (canBeSegmented(s)) cout << "Yes, This can be segmented into more than two segments"; else cout << "No, This can not be segmented into more than two segments"; }
出力
Yes, This can be segmented into more than two segments
-
数値がC++で2つの三角数の合計として表現できるかどうかを確認します
このセクションでは、1つの数を2つの三角数の合計として表現できるかどうかを確認します。三角数は以下のようになります- 例から、1、3、6、10はいくつかの三角数であることがわかります。数N(たとえば16)を2つの三角数(6、10)の合計として表す必要があります。 アプローチは非常に簡単です。 N未満のすべての三角数を取得する必要があります。これらの値からセットを作成します。ここで、集合からXと言う数を取り、N – Xが集合に存在するかどうかを確認する必要があります。そうすると、Xは2つの三角数の合計として表すことができます。 例 #include <iostream> #
-
Pythonで1と2の配列を合計が等しい2つの部分に分割できるかどうかを確認します
1と2のみを格納する配列numsがあるとします。各部分の要素の合計が同じになるように、配列を2つの異なる部分に分割できるかどうかを確認する必要があります。 したがって、入力がnums =[1、1、2、2、2]のようである場合、この配列を[1、1、2]と[2、2]の合計のように分割できるため、出力はTrueになります。各部分は4です。 これを解決するには、次の手順に従います- 合計:=0、one_count:=0 total:=numsのすべての要素の合計 one_count:=numsの1の数 合計が偶数の場合、 Falseを返す (合計/ 2)の整数部分が偶数の場合、 Tru