C/C++で配列要素の積をnで割った余りを求めるプログラム
ここでは、配列の全要素を掛け合わせた結果をnで割った余り(剰余)を計算する方法を解説します。配列とnの値はユーザーから与えられるものとします。
例えば、配列が {12, 35, 69, 74, 165, 54} の場合、積は (12 × 35 × 69 × 74 × 165 × 54) = 19107673200 となります。この値を47で割った余りは14です。
一見するとこの問題は非常にシンプルです。すべての要素を掛け合わせてから、モジュロ演算子(%)を使えば答えが得られます。しかし、ここに落とし穴があります。積を計算する過程で、その値がint型やlong型の表現範囲を超えてしまう可能性があるのです。オーバーフローが発生すると、不正な結果が返されてしまいます。
この問題を回避するために、次のような手法を用います。ポイントは、掛け算を行うたびに余りを計算しておくことです。数学的には、(a × b) mod n = ((a mod n) × (b mod n)) mod n という性質が成り立つため、途中結果を常にn未満に保つことでオーバーフローを防げます。
アルゴリズム
multiplyRemainder(arr, size, n)
begin
mul := 1
for i in range 0 to size – 1, do
mul := (mul * (arr[i] mod n)) mod n
done
return mul mod n
endサンプルコード
#include<iostream>
using namespace std;
int multiplyRemainder(int arr[], int size, int n){
int mul = 1;
for(int i = 0; i<size; i++){
mul = (mul * (arr[i] % n)) % n;
}
return mul % n;
}
int main(){
int arr[6] = {12, 35, 69, 74, 165, 54};
int size = 6;
int n = 47;
cout << "Remainder: " << multiplyRemainder(arr, size, n);
}実行結果
Remainder: 14
このように、各要素について先にnで割った余りを求めてから掛け合わせ、さらにその都度mod nを適用することで、大きな数を扱わずに済みます。これにより、配列の要素数や要素の値が大きくても、int型の範囲内で安全に剰余を計算できます。
-
配列の全要素を乗算するC++プログラムの解説
整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭
-
【Python】配列の全要素の積をnで割った余りを求めるプログラムの書き方
本記事では、以下の問題に対する解決策について詳しく解説します。問題文複数の数値からなる配列と整数 n が与えられたとき、配列内のすべての要素を掛け合わせた結果を n で割った余りを出力する必要があります。アプローチまず、arr[i] % n のように各要素の余りを個別に計算します。次に、その余りを現在の結果に掛け合わせます。掛け算を行うたびに再度剰余演算を適用することで、オーバーフローを回避できます。この手法は、モジュラー算術(合同式)の分配則に基づいています。( a * b) % c = ( ( a % c ) * ( b % c ) ) % c実装例def findremainder(ar