Java初心者の競技プログラミング日記

Dvorak配列でjavaを書いてます

階乗を求めるメソッド

再帰関数を用いて階乗を求めるメソッド。

static long Factorial (int i) {
	if (i == 1) {return 1;}
	else {return i*Factorial(i-1);}
}


i=3のとき、
・Factorial(3) = return 3*Factorial(2)
・Factorial(2) = return 2*Factorial(1)
・Factorial(1) = return 1

よって
・return 3*2*1 = 6

素数判定メソッド

値が素数かどうか判定するメソッド。

static boolean IsPrime(int n) {
	if (n < 2) return false;
	else if (n == 2) return true;
	else if (n%2 == 0) return false;
	double sqrtNum = Math.sqrt(n);
	for (int i=3; i<=sqrtNum; i+=2) {
		if (n%i == 0) {return false;}
	}
	return true;
}


【参考元】
最速の素数判定プログラム C# Java C++ - Qiita

最大公約数・最小公倍数を求めるメソッド

ユークリッドの互除法を用いて、
二つの値の最大公約数および最小公倍数を求めるメソッド。

//最大公約数gcd
static int gcd (int a, int b) {
	int temp;
	while((temp = a%b)!=0) {
		a = b;
		b = temp;
	}
	return b;
}


//最小公倍数lcm
static int lcm (int a, int b) {
	int temp;
	long c = a;
	c *= b;
	while((temp = a%b)!=0) {
		a = b;
		b = temp;
	}
	return (int)(c/b);
}


最小公倍数がint型で桁あふれを起こす場合は、long型を使う。


追記:再帰を用いることでシンプルに書ける、処理速度はほぼ同じ?

static int gcd (int x,int y) {return y>0?gcd(y,x%y):x;}


こちらの解答を参考にさせていただきました
Submission #1450553 - AtCoder Grand Contest 018

回文判定メソッド

文字列が回文かどうか判定するためのメソッド。

static boolean isPalindrome (String s) {
	int n = s.length();
	for (int i=0; i<n/2; i++) {
		if (s.charAt(i)!=s.charAt(n-i-1)) {return false;}
	}
	return true;
}


回文ならtrue、非回文ならfalseを返す。

追記:アルゴリズムを「sb.reverse()して元の文字列と照合」から「charAt()を使って両端から調べていく」ものに変更。多少早くなったと思う。