题目
总结
- 原问题转换为:1/2+1/3+1/4+…+1/(n+1) >= len
- 题中给定范围 0.01<=len<=5.20, 题中的测试案例 输入5.19 对应输出273,说明5.20对应大概二百多张 (算出准确的是276)
- 这题的数据不是很大,所以直接按照这个1/2+1/3+1/4+…+1/(n+1) 思路解决,提交可以ac
- 用这题练习下二分查找,在输入前先用 前缀和 把前i个分式加起来存放在a[i]数组中,然后另写一个函数在数组a中 折半查找 输入的数据 ,输出相应的数组下标。
代码
//直接求解
import java.util.Scanner;
public class Main {
static int paper;
static double a[]=new double[277]; //0.1~5.2 共276张卡片
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
double x;
while(cin.hasNext()) {
x=cin.nextDouble();
if(x==0.00)
break;
fun(x);
System.out.println(paper-1+" card(s)");
}
}
public static void fun(double x) {
paper=1;
double lenth=0;
while(lenth<=x) {
a[paper]=a[paper-1]+(1.0/(paper+1));
lenth=a[paper];
paper++;
}
}
}
import java.util.Scanner;
import java.math.*;
public class Main {
static int paper;
static double a[]=new double[277]; //0.1~5.2 共276张卡片
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
fun();
double x;
while(cin.hasNext()) {
x=cin.nextDouble();
if(x==0.00)
break;
erfen(1,paper-1,x);
}
}
public static void fun() { //前缀和
paper=1;
double lenth=0;
while(lenth<=5.2) {
a[paper]=a[paper-1]+(1.0/(paper+1));
lenth=a[paper];
paper++;
}
}
public static void erfen(int left,int right,double num) {//二分查找
int mid=(left+right)/2;
if(a[mid]<=num && a[mid+1]>=num)
System.out.println((mid+1)+" card(s)");
else if(num>a[mid])
erfen(mid+1,right,num);
else
erfen(left,mid-1,num);
}
}