这个算法适用于检查终止小数吗?

时间:2012-07-22 12:01:39

标签: decimal

int is_ter(int x)
{
    //it is not a TWOs nor a FIVEs and not 1.0
g:  
    if(x%2 !=0 && x%5 !=0 && x!=1 )
        return 0;
    // make sure it is 1.0
    if(x%2 !=0 && x%5 !=0 && x==1 )
        return 1;
    //check if it is a two
    if(x%2==0){
         x/=2;
         goto g;
    }
    if(x%5==0)
    {
        x/=5;
        goto g;
    }
}

2 个答案:

答案 0 :(得分:5)

从它的外观来看,你想检查1 / x是否正在终止。

您的代码看起来有些令人困惑。您需要检查所有的幂因子是2还是5:

int is_ter(unsigned int x)
{
    while (x>1)
    {
       if (x%2==0) x=x/2;
       else if (x%5==0) x=x/5;
       else return 0;
    }
    return 1;
}

应该做的伎俩(好吧,它说1/0正在终止,无论这意味着什么。它将终止程序,所以它并非完全错误......)

答案 1 :(得分:1)

不,完全没有。

首先,您的小数是一个int。其次,你应该成倍增加而不是分裂。第三,使用小数时,舍入错误始终发生,因此在将小数与某些内容进行比较时需要考虑到这一点。

最重要的是,计算机上存储的所有小数都在“终止”,因为在计算机中,小数小数不会超过有理数M / N,N为幂2。

你应该阅读floating point numbers