【算法】程序猿不写代码是不对的51

来源:互联网 发布:淘宝自动发卡平台 编辑:程序博客网 时间:2024/06/06 11:36
package com.kingdz.algorithm.time201705;import java.util.Arrays;/** * 求级数之和 *  * <pre> * 设有表达式S=1/1+1/2+1/3+1/4+...+1/n, * 现给定一个整数k,求s>k的最小n值 * 计算较大k值时需要保证精度,否则算出的数据是错误的 * 缺陷:算较大的k值时需要耗费的时间较长 * </pre> *  * @author kingdz *  */public class Algo09 {// 计算精度public static final int PRECISION = 15;public static void main(String[] args) {int k = 15;int n = calc(k);System.out.println("对于k为[" + k + "]时最小的n为[" + n + "]");}private static int calc(int k) {int[] add = new int[PRECISION];StringBuilder strb;int len = ("" + k).length();int n = 1;while (true) {int[] div = new int[PRECISION];int residue = 1;for (int i = len - 1; i < PRECISION; i++) {int divided = residue / n;int left = residue % n;div[i] = divided;if (left == 0) {break;} else {residue = left * 10;}}// System.out.println(Arrays.toString(div));for (int i = PRECISION - 1; i >= len - 1; i--) {int result = div[i] + add[i];add[i] = result % 10;if (i - 1 >= 0) {add[i - 1] += result / 10;}}System.out.println(Arrays.toString(add));strb = new StringBuilder();for (int i = 0; i < len; i++) {strb.append(add[i]);}long ret = Long.parseLong(strb.toString());if (ret >= k) {return n;}n++;}}}

0 0
原创粉丝点击