C++で2、3、5の倍数となる最大の数を求めるアルゴリズム
問題概要
この問題では、1桁の数字のみで構成されたサイズNの配列arr[]が与えられます。求めるのは、2、3、5のすべてで割り切れる最大の数です。
具体例で問題を確認してみましょう。
入力 : arr[] = {1, 0, 5, 2}
出力 : 510説明 −
数値510は、2、3、5のすべてで割り切れます。
解法アプローチ
この問題へのシンプルなアプローチは、組み立てた数の割り切り性を基本的な条件から確認していくことです。
まず、ある数が2と5の両方で割り切れるということは、すなわち10で割り切れることを意味します。10の倍数を作るためには、配列に0が含まれている必要があります。
配列に0が存在する場合は、末尾に0を配置し、その上で3でも割り切れるような最大の数を構成します。3の倍数の判定は各桁の合計で行えるため、余りごとに数字を分類して最適な組み合わせを選ぶことで効率的に求められます。
この手法の詳細は「C++で3の倍数となる最大の数を求める」の記事で解説していますので、あわせて参考にしてください。
実装例
以下は、このソリューションの動作を示すサンプルプログラムです。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string largestMultipleOfThree(vector<int>& digits) {
vector<vector<int>> d(3);
int sum = 0;
for (int i = 0; i < digits.size(); i++) {
int x = digits[i];
d[x % 3].push_back(digits[i]);
sum += x;
sum %= 3;
}
if (sum) {
if (!d[sum].size()) {
int rem = 3 - sum;
if (d[rem].size() < 2)
return "";
d[rem].pop_back();
d[rem].pop_back();
}
else {
d[sum].pop_back();
}
}
string ret = "";
for (int i = 0; i < 3; i++) {
for (int j = 0; j < d[i].size(); j++) {
ret += to_string(d[i][j]);
}
}
sort(ret.begin(), ret.end(), greater<int>());
if (ret.size() && ret[0] == '0')
return "0";
return ret;
}
};
int main(){
Solution ob;
vector<int> v = {7, 2, 0, 8};
sort(v.begin(), v.end(), greater<int>());
if(v[v.size() - 1 ] != 0){
cout<<"Not Possible!";
}
else{
cout<<"The largest number is "<<(ob.largestMultipleOfThree(v));
}
}出力結果
The largest number is 870
この例では、配列{7, 2, 0, 8}から末尾に0を置き、残りの数字で桁の合計が3の倍数になるように選ぶことで、最大の数「870」が得られています。配列に0が含まれない場合は、2と5の両方で割り切れる数が作れないため、「Not Possible!」と表示されます。
-
C++で円柱の周囲長を求める方法
円柱の直径と高さが与えられたとき、その周囲長を求めたいというケースがあります。しかし、周囲長は本来2次元図形の輪郭の長さを表す概念であるため、3次元の物体である円柱に対して直接求めることはできません。そこで考え方として、円柱の断面を展開して長方形として捉える方法を使います。円柱を横から見た断面は長方形になり、この長方形の2辺はそれぞれ「直径」と「高さ」に対応します。つまり、円柱の周囲長は次の式で計算できます。計算式p = (2 * d) + (2 * h)d: 円柱の直径h: 円柱の高さ直径の2倍と高さの2倍を足し合わせることで、展開された長方形の外周が求まります。C++での実装例以下は、直径
-
C++でLCMとHCFが与えられたときにもう一方の数を求める方法
ある数Aと、その最小公倍数(LCM)および最大公約数(HCF/GCD)の値が与えられているとき、もう一方の数Bを求める問題を考えます。例えば、A = 5、LCM = 25、HCF = 4が与えられた場合、もう一方の数は20になります。この問題を解く鍵となるのは、任意の2つの数AとBの間に常に成り立つ次の重要な数学的性質です。$$𝐴∗𝐵=𝐿𝐶𝑀∗𝐻𝐶𝐹$$つまり、「2つの数の積」は「最小公倍数と最大公約数の積」と等しくなります。この式をBについて変形すると、次のようになります。$$𝐵= \frac{LCM*HCF}{A}$$アルゴリズム数A、LCM、