2012-07-22 229 views
0
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; 
    } 
} 
+0

什么是'终止小数'?你为什么使用'goto'?例如,如果x = 0,则有一个inifite循环。否定也会造成严重破坏。 – zmbq 2012-07-22 12:07:20

+0

小数点不具有重复周期 1/5正在终止,因为它== 0.2 而1/6和1/7不是 并且关于输入x总是> 0 – 2012-07-22 12:09:23

+0

啊,好的。所以不行。 – zmbq 2012-07-22 12:10:18

回答

1

不,完全没有。

首先,你的小数是一个整数。其次,你可能应该是乘法而不是分裂。第三,使用小数时,舍入误差会一直出现,所以在比较小数与某些事物时需要考虑这一点。

而且最重要的是,存储计算机上的所有小数是“终止”,因为在一台计算机,一个十进制分数不小于有理数M/N多得多,其中N是2的一个

功率

您应该阅读约floating point numbers

+0

好吧让我解释这更多 我有一个分数a/b ,我只发送b到这个函数 所以如果我们有5984845495/32 我们知道这部分是终止的(不重复连续期间).. 所以我不检查一个小数本身,这是如此不合理。 – 2012-07-22 12:15:11

+0

这是一个不同的问题。你需要看看b是否有一个不是2或5的素数因子。因此,除以2直到你不能再存在,然后除以5直到你不能再存在。你的代码试图做这样的事情,但并没有真正做到这一点。 – zmbq 2012-07-22 12:19:48

5

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

你的代码看起来有点混乱。你要检查所有的primefactors是否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终止,这意味着什么这将终止程序,所以它的。不完全错误......)

+0

是的,我忘了提及输入x> 0 尽管如此,我用你的代码,而是我得到了相同的结果.. – 2012-07-22 12:22:39