UVa 763 - Fibinary Numbers

来源:互联网 发布:lurker软件怎么下载 编辑:程序博客网 时间:2024/05/21 05:19

传送门

UVa 763 - Fibinary Numbers


一个多月没在CSDN上发(che)表(dan)题解了,每天打开都看到那个黑色的持之以恒,强迫症表示不能忍。看到这题的java题解好像没有,就来水一篇


题意:

Fibonacci数给两个,求这两个数之和的Fibonacci数表示。


所谓Fibonacci数,和二进制差不多。最高位对应第n个Finonacci数,然后是1的就加起来。

题目还要求要使和尽量大,这个没关系,从后面往前面减即可。


思路:

把两个数转换为十进制数,再转换为Fibonacci数。


思路很简单,但是调试了快两个小时。原因在于输出的时候。

一开始我是碰到一个就输出"1",第一次跑了2989ms,吓cry了( TДT).

接下来连续交了几次果断TLE.

后来才知道这样的效率非常慢,正确的方法应该是string一个字符串,碰到1就加上,最后一起输出。

不过这两个小时还是值得的(๑•̀ㅂ•́)و✧


import java.math.*;import java.util.*;import java.io.*;public class Main {static BigInteger[] dp = new BigInteger[111];public static int find_start(BigInteger n) {for (int i = 1; i < 105; i++)if (dp[i].compareTo(n) > 0)return i - 1;return 0;}public static void main(String[] args) {Scanner in = new Scanner(System.in);boolean first = true;dp[1] = BigInteger.valueOf(1);dp[2] = BigInteger.valueOf(2);for (int i = 3; i < 111; i++)dp[i] = dp[i - 1].add(dp[i - 2]);while (in.hasNext()) {String fstr = in.next();String sstr = in.next();BigInteger sum = BigInteger.ZERO;for (int i = 0; i < fstr.length(); i++)if (fstr.charAt(i) == '1')sum = sum.add(dp[fstr.length() - i]);for (int i = 0; i < sstr.length(); i++)if (sstr.charAt(i) == '1')sum = sum.add(dp[sstr.length() - i]);//System.out.println(sum);if (!first)System.out.printf("\n");int ind = find_start (sum);String ans = new String ("");for (int i = ind; i >= 1; i--) {if (dp[i].compareTo(sum) <= 0){ans += "1";sum = sum.subtract(dp[i]);}else ans += "0";}if (ind == 0)ans += "0";System.out.println(ans);if (first) {first = false;}}}}



0 0
原创粉丝点击