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

配列の全要素の積をnで割った余りを求めるJavaプログラム

配列に含まれるすべての要素を掛け合わせた値(総乗)を、特定の数値 n で割った余りを求めたいケースは、競技プログラミングや暗号処理などの場面でよく登場します。本記事では、その計算を効率的かつ安全に実現するJavaプログラムを紹介します。

実装例

import java.util.*;
import java.lang.*;
public class Demo{
    public static int remainder(int my_arr[], int arr_len, int val){
        int mul_val = 1;
        for (int i = 0; i < arr_len; i++)
            mul_val = (mul_val * (my_arr[i] % val)) % val;
        return mul_val % val;
    }
    public static void main(String argc[]){
        int[] my_arr = new int []{ 35, 100, 69, 99, 27, 88, 12, 25 };
        int arr_len = 8;
        int val = 11;
        System.out.println("配列の全要素の積を11で割った余りは次のとおりです");
        System.out.println(remainder(my_arr, arr_len, val));
    }
}

出力結果

配列の全要素の積を11で割った余りは次のとおりです
0

プログラムの解説

Demo クラスの中には、remainder という静的メソッドが定義されています。このメソッドは、引数として受け取った整数配列を先頭から順番に走査し、各要素に対して剰余演算を適用しながら積を累積的に計算していきます。

ここで重要なのが、ループ内で毎回 % val を適用している点です。すべての要素を掛け終わってから最後に一度だけ余りを求めると、中間結果が int 型の範囲(約21億)を超えてオーバーフローを起こす恐れがあります。そこで、剰余演算の性質「(a × b) % m = ((a % m) × (b % m)) % m」を利用し、各ステップで余りを取りながら計算することで、大きな数でも安全に処理できるようになっています。

main メソッドでは、除数となる数値(val = 11)、対象の整数配列、そして配列の長さがそれぞれ定義されます。続いて、これら3つを引数として remainder メソッドを呼び出し、得られた結果をコンソールに出力しています。

今回の例では、配列 {35, 100, 69, 99, 27, 88, 12, 25} のうち 35 と 99 が 11 で割り切れるため、全体の積も必ず 11 の倍数となり、余りは 0 になります。

  1. 正方形の面積を求めるJavaプログラムの書き方【初心者向け解説】

    この記事では、Javaを使って正方形の面積を求める方法をわかりやすく解説します。正方形の面積は、次の公式で計算できます。辺 × 辺つまり s2正方形の面積の計算式正方形の1辺の長さを s とすると、その面積は s2(辺の2乗)で表されます。下図のように、縦と横が同じ長さの図形であるため、辺同士を掛け合わせるだけで面積が求まります。入力例1辺の長さ : 4出力例正方形の面積 : 16アルゴリズム処理の流れは以下の手順になります。Step 1 - 開始Step 2 - 整数型の変数 my_side(辺の長さ)と my_area(面積)を宣言するStep 3 - ユーザーから値を読み込む、または値を

  2. 【Python】配列の全要素の積をnで割った余りを求めるプログラムの書き方

    本記事では、以下の問題に対する解決策について詳しく解説します。問題文複数の数値からなる配列と整数 n が与えられたとき、配列内のすべての要素を掛け合わせた結果を n で割った余りを出力する必要があります。アプローチまず、arr[i] % n のように各要素の余りを個別に計算します。次に、その余りを現在の結果に掛け合わせます。掛け算を行うたびに再度剰余演算を適用することで、オーバーフローを回避できます。この手法は、モジュラー算術(合同式)の分配則に基づいています。( a * b) % c = ( ( a % c ) * ( b % c ) ) % c実装例def findremainder(ar