今回はJavaの演習問題などを解いていてよく出てくる整数に関する処理をメソッドで作ってみよう。
偶数判定
[問題例]
数値を入力するとそれが偶数か奇数なのかを出力せよ
数値を入力>>5
5は奇数です
[メソッド]
static boolean isEven(int n){
return n % 2 == 0;
}
[解説]
偶数か奇数の判定はその値を2で割ったあまりが0と等しいかで求める。
この際2で割ったあまりが1かどうかで奇数を判定してはいけない。なぜなら負の値になったときに結果が変わってしまうからだ。
-3は奇数だが-3 % 2 == 1
で判定するとtrueにならない(あまりは-1)
なので偶数か奇数かの判定は必ず2で割ったあまりが0かどうかで判定すること
[解答例]
import java.util.Scanner;
public class Num {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("数値を入力>>");
int n = sc.nextInt();
System.out.printf("%dは%sです%n",n,isEven(n)? "偶数":"奇数");
sc.close();
}
static boolean isEven(int n){
return n % 2 == 0;
}
}
桁数判定
[問題例]
数値を入力するとそれが何桁の数なのか表示せよ
数値を入力>>51343
51343は5桁の数です
[メソッド]
static int numLength(int n){
return String.valueOf(n).length();
}
[解説]
知らなければif文で判定してしまいそうだが、これはまさに目からウロコ。文字に変換してしまって文字の数で求める。この例に限らずこの手の問題は数値を文字に変換してしまうとラクな場合が多い。
[解答例]
import java.util.Scanner;
public class Num {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("数値を入力>>");
int n = sc.nextInt();
System.out.printf("%dは%d桁の数です%n",n,numLength(n));
sc.close();
}
static int numLength(int n){
return String.valueOf(n).length();
}
}
数値を逆順に表示
[問題例]
入力された数値を逆順に表示する処理を作成せよ
数値を入力>>1340
逆順に表示します0431
[メソッド]
static String numReverse(int n){
String result="";
while(n>0){
result += n%10;
n/=10;
}
return result;
}
[解説]
これもすべて文字列にしてしまって逆順にという方法も有望だ。しかし、今回は%演算子と/演算子を使って下一桁を順に取り出す方法で行った。
日常生活では余りを気にする機会は少ないが、%演算子はプログラミングにおいては最重要。必ず完璧に理解しておく必要がある。
(今回は0が先頭に来ることもあるので戻り値はStringとした)
[解答例]
import java.util.Scanner;
public class Num {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("数値を入力>>");
int n = sc.nextInt();
System.out.printf("逆順に表示します%s%n",numReverse(n));
sc.close();
}
static String numReverse(int n){
String result="";
while(n>0){
result += n%10;
n/=10;
}
return result;
}
ゾロ目判定
[問題例]
数値を入力するとそれがゾロ目なのかどうかを判定せよ。1桁の数や負の数はゾロ目とは考えないこととする。
数値を入力>>2222
2222はゾロ目です
[メソッド]
static boolean isZoro(int n){
if(n<9){
return false;
}
char[] arr=String.valueOf(n).toCharArray();
char first=arr[0];
for(int i=1;i<arr.length;i++){
if(arr[i] != first){
return false;
}
}
return true;
}
[解説]
問題をひと目見た印象とは違い、いざやってみるとなかなか難しい問題の一つだ。ここでもやはり、文字列に変換後、配列にして、要素がすべて同じかで判定している。
[解答例]
import java.util.Scanner;
public class Num {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("数値を入力>>");
int n = sc.nextInt();
System.out.printf("%dはゾロ目%s%n",n,isZoro(n)? "です":"ではありません");
sc.close();
}
static boolean isZoro(int n){
if(n<9){
return false;
}
char[] arr=String.valueOf(n).toCharArray();
char first=arr[0];
for(int i=1;i<arr.length;i++){
if(arr[i] != first){
return false;
}
}
return true;
}
回文数判定
[問題例]
数値を入力するとそれが回文数なのかどうかを出力せよ
数値を入力>>12621
12621は回文数です
[メソッド]
static boolean isKaibunsu(int n){
char[] arr=String.valueOf(n).toCharArray();
for(int i=0;i<arr.length/2;i++){
if(arr[i] != arr[arr.length-1-i]){
return false;
}
}
return true;
}
[解説]
回文数とは右から読んでも左から読んでも同じ数のこと。今回はこれを判定するメソッドを作成する。やはり、文字列配列に変換後、一番左と一番右、その一つ内側同士・・・と比較していって一つで違うものがあれば回文ではないというロジックで行っている。知っているか知らないかが大きく影響する問題
[解答例]
import java.util.Scanner;
public class Num {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("数値を入力>>");
int n = sc.nextInt();
System.out.printf("%dは回文数%s%n",n,isKaibunsu(n)? "です":"ではありません");
sc.close();
}
static boolean isKaibunsu(int n){
char[] arr=String.valueOf(n).toCharArray();
for(int i=0;i<arr.length/2;i++){
if(arr[i] != arr[arr.length-1-i]){
return false;
}
}
return true;
}
}
素数判定
[問題例]
数値を入力するとそれが素数なのか表示せよ
数値を入力>>227
227は素数です
[メソッド]
static boolean isPrime(int n){
if(n<2){
return false;
}
for(int i= 2;i<n;i++){
if(n % i ==0){
return false;
}
}
return true;
}
[解説]
素数(Prime Number)とは1 より大きい自然数で、正の約数が 1 と自分自身のみの数である。
最小の素数は2で、素数は無限に存在することが証明されている。
この判定メソッドでは、判定したい数nを、2,3,4,...n-1
と順番に割ってみて割り切れたら素数でないと判定している。
[解答例]
import java.util.Scanner;
public class Num {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("数値を入力>>");
int n = sc.nextInt();
System.out.printf("%dは素数%s%n",n,isPrime(n)? "です":"ではありません");
sc.close();
}
static boolean isPrime(int n){
if(n<2){
return false;
}
for(int i= 2;i<n;i++){
if(n % i ==0){
return false;
}
}
return true;
}
}
フィボナッチ数判定
[問題例]
1,1,2,3,5,8,13….
というフィボナッチ数列に指定された数が含まれているかを判定せよ
数値を入力>>55
55はフィボナッチ数です
[メソッド]
static boolean isFibo(int n){
if(n<1){
return false;
}
if(n==1){
return true;
}
int n1=1;
int n2=1;
int fibo;
do{
fibo=n1+n2;
if(n==fibo){
return true;
}
n1=n2;
n2=fibo;
}while(fibo<n);
return false;
}
[解説]
2つ前の項と1つ前の項を足し合わせていくことでできる数列をフィボナッチ数列という。最初の2項を0,1
と定義する場合と 1,1
と定義される場合があるが今回はより一般的な自然数に対するフィボナッチ数列を扱った。
さて、メソッドであるが最初の2項を1,1で定義しあとはループ内で前2項を足し合わせ次の項目を作っている。これを指定された数の範囲で見ていき一致したらフィボナッチ数であると判定している。日常生活においては全く不要なフィボナッチ数列だが、プログラミングのお題としてはよく出題されるので基本的な内容は理解しておくとよい。
[解答例]
import java.util.Scanner;
public class Num {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("数値を入力>>");
int n = sc.nextInt();
System.out.printf("%dはフィボナッチ数%s%n",n,isFibo(n)? "です":"ではありません");
sc.close();
}
static boolean isFibo(int n){
if(n<1){
return false;
}
if(n==1){
return true;
}
int n1=1;
int n2=1;
int fibo;
do{
fibo=n1+n2;
if(n==fibo){
return true;
}
n1=n2;
n2=fibo;
}while(fibo<n);
return false;
}
}
コメント