C++で指定した数が無限の等差数列に存在するかどうかを判定する方法
3つの整数 a、b、c が与えられたとします。初項を a、公差を c とする無限に続く等差数列を考えたとき、b がこの数列に含まれるかどうかを判定するのが本記事のテーマです。
例えば、a = 1、b = 7、c = 3 の場合、数列は「1, 4, 7, 10, …」となります。この中に 7 は含まれているため、出力は「Yes」になります。
判定の考え方
この問題は、次の2つのケースに分けて考えることで解くことができます。
- c = 0 の場合: 数列のすべての項は a と等しくなります。したがって、a = b であれば「Yes」を出力し、a ≠ b であれば「No」を返します。
- c > 0 の場合: ある非負の整数 k に対して b = a + k × c が成り立てば、b は数列に含まれることになります。これは「(b − a) が c の倍数であり、かつ b − a ≥ 0 である」と言い換えられます。つまり、(b − a) / c が非負の整数になればよいのです。
C++での実装例
上記の考え方をもとに、C++で実装すると以下のようになります。
#include<iostream>
using namespace std;
void isBInSequence(int a, int b, int c){
if (a == b)
cout << "Yes";
if ((b - a) * c > 0 && (b - a) % c == 0)
cout << "Yes";
else
cout << "No";
}
int main() {
int a = 1, b = 7, c = 3;
cout << "The answer is: ";
isBInSequence(a, b, c);
}
実行結果
The answer is: Yes
このように、剰余演算と符号の判定を組み合わせることで、無限に続く数列であっても O(1) の計算量で b の存在を効率的に判定できます。等差数列の性質を理解していれば、実際に数列を生成して順に比較する必要はありません。
-
C++で文字列の順列の総数を求めるプログラムの作成方法
文字列に含まれる文字は、さまざまな順序で並べ替えることができます。本記事では、与えられた文字列から作成できる順列の数を求める方法を解説します。たとえば「abc」という3文字の文字列の場合、並べ方は 3! = 6 通りあります。つまり、n 文字の文字列であれば、最大で n! 通りの並べ方が存在します。しかし、「aab」のように同じ文字が複数回含まれている場合、単純に 6 通りにはなりません。「aab」の全パターンを書き出してみると、次のようになります。abaaabbaabaaaababaこのうち、(1番目と6番目)、(2番目と5番目)、(3番目と4番目) のペアはそれぞれ同一の並び方です。したが
-
与えられた数列に特定の数が存在するかどうかを判定するPHPプログラム
与えられた数列(等差数列)の中に特定の数が存在するかどうかを判定したい場合、以下のようなコードで簡単に実現できます。サンプルコード<?php function contains_in_sequence($val_1, $val_2, $val_3) { if ($val_1 == $val_2) return true; if (($val_2 - $val_1) * $val_3 > 0 && ($val_2 - $val_1) % $val_3 == 0) return true; retu