No older revisions available
No older revisions available
2006.1.4
접근 방법 ¶
반복적인 계산을 줄이기 위해서, bottom-up 방식으로 수열을 처음부터 계산하였다. 계산된 이전 값을 사용하여 다음 수열을 빠르게 얻을 수 있었다. Dynamic Programming을 처음으로 해보았다
소스 코드 ¶
~java
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 ¶
~java
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")));
}
}










