POJ1003 二分_查找/自定义zero()函数

1 题意。

2 分析。

参考的,a.它没有用递归,b.而且抽象出了Zero()函数,c.在细节上它让card[0]=0.0考虑到了小于0.5的情况(不用像自己写的还得特判)——【多想想某个递推的开始第一个值是不是需要为0】,是值得学习的。

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
const double delta=1e-8;
const int maxn=1010;
double card[maxn];
double CMP=5.20;
int Zero(double x){
    if(x<-delta)//x<-delta,x is a negative real number
        return -1;
    else{              //return 0:x-delta<=0, because of"else", That is x==delta==0
        return x>delta;//return 1:x-delta>0,x is a postive real number
    }
}
int main()
{
    //freopen("out.txt","w",stdout);
    int star=0;
    card[star++]=0.0;
    for(int i=2;Zero(card[star-1]-CMP)<0;i++){
        card[star]=1.0/(double)i+card[star-1];
        star++;
    }

    double data;
    scanf("%lf",&data);
    while(Zero(data)){
        int l=0;
        int r=star;
        while(l+1<r){
            int mid=(l+r)>>1;
            if(Zero(card[mid]-data)<0)
                l=mid;//! l!=mid+1
            else
                r=mid;
        }
        printf("%d card(s)\n",r);
        scanf("%lf",&data);
    }
    return 0;
}

自己写的,不是很标准,而且用了递归

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
const double delta=1e-8;
const int maxn=1010;
double card[maxn];
double CMP=5.20;
void Erfen(double t,int l,int r){
    int mid=(l+r)>>1;
    if(card[mid]<t&&card[mid+1]>t){
        printf("%d card(s)\n",mid+1);
        return ;
    }
    if(card[mid]<t){
        Erfen(t,mid+1,r);
    }
    else if(card[mid]>t){
        Erfen(t,l,mid);
    }
    return ;
}
int main()
{
    //freopen("out.txt","w",stdout);
    int star=1;
    card[star++]=1.0/2.0;
    for(int i=3;i<=1000;i++){
        card[star]=(double)(1.0/(double)i)+card[star-1];
        star++;
        if(card[star-1]>CMP){
            break;
        }
    }
    card[star]=0;//boundary

    double data;
    while(~scanf("%lf",&data)){
        if(fabs(data-0.0)<delta) break;
        if(data<card[1]) printf("%d card(s)\n",1);
        else if(data>card[star-1]) printf("%d card(s)\n",star-1);
        else Erfen(data,1,star);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值