More actions
imported>Unknown No edit summary |
(Repair batch-0002 pages from live compare) |
||
| Line 36: | Line 36: | ||
} | } | ||
BigInteger | BigInteger[] fibRoom = new BigInteger[4]; | ||
fibRoom | fibRoom[1] = one; | ||
fibRoom | fibRoom[2] = two; | ||
while(true) { | while(true) { | ||
fibRoom | fibRoom[3] = fibRoom[1].add(fibRoom[2]); | ||
if (start.compareTo(fibRoom | if (start.compareTo(fibRoom[3]) <= 0 && fibRoom[3].compareTo(end) <= 0) { | ||
howMany++; | howMany++; | ||
} | } | ||
if (fibRoom | if (fibRoom[3].compareTo(end) > 0) { | ||
break; | break; | ||
} | } | ||
fibRoom | fibRoom[1] = fibRoom[2]; | ||
fibRoom | fibRoom[2] = fibRoom[3]; | ||
} | } | ||
return howMany; | return howMany; | ||
| Line 62: | Line 62: | ||
} | } | ||
public static void main(String | public static void main(String[] args) { | ||
Fibonacci fib = new Fibonacci(); | Fibonacci fib = new Fibonacci(); | ||
| Line 71: | Line 71: | ||
} | } | ||
BigInteger start = new BigInteger(line.split(" ") | BigInteger start = new BigInteger(line.split(" ")[0]); | ||
BigInteger end = new BigInteger(line.split(" ") | BigInteger end = new BigInteger(line.split(" ")[1]); | ||
int numOfFibs = fib.howManyFib(start, end); | int numOfFibs = fib.howManyFib(start, end); | ||
Latest revision as of 00:16, 27 March 2026
2006.1.4
접근 방법
반복적인 계산을 줄이기 위해서, bottom-up 방식으로 수열을 처음부터 계산하였다. 계산된 이전 값을 사용하여 다음 수열을 빠르게 얻을 수 있었다. Dynamic Programming을 처음으로 해보았다 :)
소스 코드
import java.math.BigInteger;
import java.util.Scanner;
public class Fibonacci {
public String readLine() {
return new Scanner(System.in).useDelimiter("\n").next().trim();
}
public int howManyFib(BigInteger start, BigInteger end) {
int howMany = 0;
BigInteger zero = new BigInteger("0");
BigInteger one = new BigInteger("1");
BigInteger two = new BigInteger("2");
if ((start.equals(zero) && end.equals(one)) ||
(start.equals(one) && end.equals(one)) ||
(start.equals(two) && end.equals(two))) {
return 1;
}
else if (start.equals(one) && end.equals(two)) {
return 2;
}
else if (start.equals(one)) {
howMany = 2;
}
else if (start.equals(two)) {
howMany = 1;
}
BigInteger[] fibRoom = new BigInteger[4];
fibRoom[1] = one;
fibRoom[2] = two;
while(true) {
fibRoom[3] = fibRoom[1].add(fibRoom[2]);
if (start.compareTo(fibRoom[3]) <= 0 && fibRoom[3].compareTo(end) <= 0) {
howMany++;
}
if (fibRoom[3].compareTo(end) > 0) {
break;
}
fibRoom[1] = fibRoom[2];
fibRoom[2] = fibRoom[3];
}
return howMany;
}
public void printNumOfFibs(int numOfFibs) {
System.out.println(numOfFibs);
}
public static void main(String[] args) {
Fibonacci fib = new Fibonacci();
while(true) {
String line = fib.readLine();
if (line.equals("0 0")) {
break;
}
BigInteger start = new BigInteger(line.split(" ")[0]);
BigInteger end = new BigInteger(line.split(" ")[1]);
int numOfFibs = fib.howManyFib(start, end);
fib.printNumOfFibs(numOfFibs);
}
}
}
Test Code
import java.math.BigInteger;
import junit.framework.TestCase;
public class TestFibonacci extends TestCase {
public void testSample() {
Fibonacci fib = new Fibonacci();
assertEquals(5, fib.howManyFib(new BigInteger("10"), new BigInteger("100")));
assertEquals(4, fib.howManyFib(new BigInteger("1234567890"),
new BigInteger("9876543210")));
assertEquals(1, fib.howManyFib(new BigInteger("1"), new BigInteger("1")));
assertEquals(1, fib.howManyFib(new BigInteger("0"), new BigInteger("1")));
}
}