Beberapa hari yang lalu, saya memposting tentang
Soal 3n+1. Nah, kali ini adalah jawabanya dengan menggunakan java. Bagi yang belum tahu soalnya, ada
disini. Dibawah ini merupakan coding untuk jawaban soal itu dengan menggunakan java. Bagi yang ingi tahu penulisan java yang baik dan benar, lihat
disini.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
Q100 q100 = new Q100();
final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = reader.readLine()) != null) {
String REGEX_WHITESPACE = "\\s+";
String cleanLine = line.trim().replaceAll(REGEX_WHITESPACE, " ");
String[] tokens = cleanLine.split(REGEX_WHITESPACE);
if (tokens.length == 2) {
long a = new Long(tokens[0]).longValue();
long b = new Long(tokens[1]).longValue();
System.out.println(cleanLine + " " + q100.countMaxIterationBetweenTwoNumbers(a, b));
}
}
}
public static class Q100 {
private final long MAX_CACHE_SIZE = 65536;
private final long[] cache = new long[(int) MAX_CACHE_SIZE];
public long countIteration(long originalNumber) {
long n = originalNumber;
long count = 1;
while (n > 1) {
if (((n - 1) >> 1) == (n >> 1)) {
long newNumber = (3 * n) + 1;
if (newNumber < n) {
throw new RuntimeException("overflow :" + originalNumber);
} else {
n = newNumber;
}
} else {
n = n >> 1;
}
if (n < MAX_CACHE_SIZE && cache[(int) n] != 0) {
return count + cache[(int) n];
}
count++;
}
return count;
}
public long countMaxIterationBetweenTwoNumbers(long a, long b) {
final long big;
final long small;
if (a > b) {
big = a;
small = b;
} else {
small = a;
big = b;
}
long winner = -1;
for (long i = small; i <= big; i++) {
long count = countIteration(i);
if (i < MAX_CACHE_SIZE) {
cache[(int) i] = count;
}
if (count > winner) {
winner = count;
}
}
return winner;
}
}
}
Berikut ini Hasilnya :
Komentar
Posting Komentar