HDU1160 Cantor

来源:互联网 发布:资源数据库微博 编辑:程序博客网 时间:2024/05/16 15:40

HDU1160 Cantor

题目链接:

题意:给一个数,范围是01,包括两个端点。判断他的三进制表示中是否含有1。输入”END”则本题结束。

思路:初想此题,简直蛋疼。什么JB玩意?!后面看着题解,突然脑子迸出这样一个方程

,然后两边等式同时乘以3。因为所有的a只能取012三个值,所以乘以三后,n的整数部分即为a1,这就解决了如何求系数的问题。

剩下的问题是,如何判断循环小数?题解给出了这样的答案:如果当前数字与最开始数字的差小于eps(自己定义,根据题目为1e-7),则循环过。事实上有的小数是到一定位数以后才开始循环的,所以这个地方还有些问题,不过题目已经AC

本次还学到了sscanf函数,不由得说收获多多。

源码:

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <algorithm>

#include <iostream>

#include <vector>

using namespace std;

double eps = 1e-7;

bool cal(double n)

{

    if(1-n<eps) return true;

    int inter;

    double now,org=n;

    while(1){

        inter = n*3;

        if(inter==1)    return false;

        n = n*3 - inter;

        if(fabs(org-n)<eps) break;

    }

    return true;

}

int main()

{

    double n;

    char temp[10];

    while(scanf("%s",temp)!=EOF && temp[0]!='E'){

        sscanf(temp,"%lf",&n);

        if(cal(n)) puts("MEMBER");

        else puts("NON-MEMBER");

    }

    return 0;

}

 

0 0