練習問題

Java【練習問題】~入力された数値を素因数分解するプログラム

ここでは入力された任意の数値を素因数分解するプログラムを作ります。

 

素因数分解とは?

素因数分解とはある数値を2以上の数値のかけ算で表現することです。

例えば、8を素因数分解すると 2×2×2 となります。

また、負の数が入力された場合は-1をかけ、正の数と同じように計算します。

このことを踏まえて4つのメソッドを使ったプログラムを作っていきます。

 

メソッドがわからない方はメソッドの使い方メソッドの使い方の記事をご覧ください。

あわせて読みたい
Java【入門編】~メソッドの使い方~ここではメソッドについて解説していきます。 前:配列 http://mittsu2017.com/post-77/ ...

 

要素別に作っていく

素因数分解したい数値を入力させる。

まずはキーボード入力で数値を入力できる様にしていきます。

キーボード入力をさせる方法が分からない方は、

キーボード入力のやりかたの記事をご覧ください。

あわせて読みたい
Java【入門編】~キーボード入力のやり方~ここでは変数の値をキーボードで入力する方法について解説します。 前:条件分岐~switch文~ http://mittsu2...

 

これは簡単でこうなります。

static int 入力() throws IOException{

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

System.out.println("数値を入力してください");

return Integer.parseInt(br.readLine());

}

 

素数を取り出していく。

素因数分解は素数のかけ算で数を表現するものですので、素数を取り出していきます。

今回は負の数にも対応できるようにします。

方法は負の数が入力されたら、-1をかけることで正の数に直して計算を行います。

if (num<0) {

num*=-1;

list.add(-1);

}

このプログラムでは最後に〇×〇みたいな形で出力させたいのでまず、取り出した素数をlistに収納します。

素数を取り出していく作業は変数iを2から1ずつカウントアップして割り切れる値を探していきます。

そして、割り切れる数を見つけたら、実際に割り算を行い、割ったときの変数iの値をlistに収納します。

そして、変数iを初期化します。

このときに注意することは初期化を行った後に、i++の処理を行いますので、i=2ではなくi=1にしてください。

for(int i=2;i<=num;i++) {

if (num%i==0) {

num=num/i;

list.add(i);

i=1;

}

}

For文、IF文の使い方が分からない人はこちらの記事をご覧ください。

あわせて読みたい
Java【入門編】~繰り返しの処理 For文~ここでは一定の処理を何回も繰り返す方法について解説します。 前:キーボード入力 繰り返しの処理は For文、while文、d...
あわせて読みたい
Java【入門編】~条件分岐 if文~ここでは条件分岐について解説します。 前:四則演算 http://mittsu2017.com/post-19/ ...

 

スポンサーリンク


取り出した素数を配列に入れ直す。

listのままでは使い勝手が悪いので配列に入れ直します。

どうせ、配列に入れ直すのなら最初から配列を使えば良かったと思う人もいるかもしれませんが、最初にlistを使ったのにはちゃんとした理由があります。

これは配列は最初の宣言するときに要素を何個収納するのかを決めなければなりません。
それに対して、listは要素をいくらでも収納していくことが出来ます。

このことから、今回の素因数分解の様な何個要素を使うか分からない時はlistを使った方が良いといえます。

そんな理由で今回はlistを使いました。

配列に入れ直す方法はlistの大きさだけの配列を作り、1つずつ配列に入れていきます。

配列の使い方がわからない方は配列の使い方の記事をご覧ください。

あわせて読みたい
Java【入門編】~配列の使い方~ここでは、配列について解説していきます。 前:continue文 http://mittsu2017.com/wp-admi...

 

int[] 素数=new int[list.size()];

for (int i=0;i<list.size();i++) {

素数[i]=list.get(i);

}

 

素因数分解の計算のメソッドは上の2と3を合わせて作ります。

ソースコード

static int[] 計算(int num) {

if (num<0) {

num*=-1;

list.add(-1);

}

for(int i=2;i<=num;i++) {

if (num%i==0) {

num=num/i;

list.add(i);

i=1;

}

}

//取り出した素数を配列に入れ直す

int[] 素数=new int[list.size()];

for (int i=0;i<list.size();i++) {

素数[i]=list.get(i);

}

return 素数;

}

 

 

結果を表示する。

計算の結果を表示するメソッドを作ります。

今回は〇×〇という形で結果を表示したいのでまず、素因数の最後の1個以外を表示させます。
そのときに一緒に×も表示させます。
最後に、最後の一個を表示させます。

ソースコード

static void 出力(int[] 結果) {

System.out.println("素因数分解するとこうなります");

for (int i=0;i<結果.length-1;i++) {

System.out.print(結果[i]+"×");

}

System.out.println(結果[結果.length-1]);

}

 

メインメソッドを設定する。

最後にそれぞれのメソッドを呼び出すためのメインメソッドを作成します。

ソースコード

public static void main(String[] args) throws IOException {

int num=入力();

int[] 素数=計算(num);

出力(素数);

}

 

最後に上のプログラムを合わせて完成です。

 

完成形

ソースコード

import java.io.*;

import java.util.*;

public class factorization {

static ArrayList list=new ArrayList();

//各メソッドを呼び出す

public static void main(String[] args) throws IOException {

int num=入力();

int[] 素数=計算(num);

出力(素数);

}

//素因数分解したい数値を入力させる

static int 入力() throws IOException{

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

System.out.println("数値を入力してください");

return Integer.parseInt(br.readLine());

}

//素数を取り出していく

static int[] 計算(int num) {

if (num<0) {

num*=-1;

list.add(-1);

}

for(int i=2;i<=num;i++) {

if (num%i==0) {

num=num/i;

list.add(i);

i=1;

}

}

//取り出した素数を配列に入れ直す

int[] 素数=new int[list.size()];

for (int i=0;i<list.size();i++) {

素数[i]=list.get(i);

}

return 素数;

}

//結果を表示する

static void 出力(int[] 結果) {

System.out.println("素因数分解するとこうなります");

for (int i=0;i<結果.length-1;i++) {

System.out.print(結果[i]+"×");

}

System.out.println(結果[結果.length-1]);

}

}

 

実行結果

C:\Users\Desktop\Java\jdk1.8.0_131\program>java factorization
数値を入力してください
-36
素因数分解するとこうなります
-1×2×2×3×3
C:\Users\Desktop\Java\jdk1.8.0_131\program>java factorization
数値を入力してください
36
素因数分解するとこうなります
2×2×3×3

 



あわせて読みたい
サイトマップ ...