2011-10-04 48 views
3

我想實現用戶自定義函數,它測試一個數是否爲整數:測試,如果給定的數字整數

#include <iostream> 
#include <typeinfo> 
using namespace std; 
bool integer(float k){ 
        if (k==20000) return false;; 
        if (k==(-20000)) return false; 
if (k==0) return true; 
    if (k<0) return integer(k+1); 
    else if(k>0) return integer (k-1); 
    return false; 
} 
int main(){ 

    float s=23.34; 
     float s1=45; 
     cout<<boolalpha; 
     cout<<integer(s)<<endl; 
     cout<<integer(s1)<<endl; 
     return 0; 

} 

這樣的想法是,如果一個數是一個整數,不要緊,如果它是一種消極或積極的,如果我們減少或加一的話,我們必須讓零,但問題是,我們如何創造增加和減少的上限和下限?

+1

我甚至不...爲什麼你考慮> 20000 <-20000不是整數?你爲什麼會開始在你的範圍中間進行比較,而不是從-20000開始比較? – tenfour

+0

,你是對我有MAX_INT和MIN_INT –

+0

沒有@ tenfour改變了它,我讀一節關於數論在那裏討論的話題(二次)殘留物和質數殘留的根等等,這裏是算法在某種程度上涉及到整數的期限,如果從東西平方根是整數,那麼它是根,所以它是主要的原因 –

回答

18
#include <cmath> 

bool is_integer(float k) 
{ 
    return std::floor(k) == k; 
} 

這個解決方案應該工作爲k所有可能的值。我很確定這是一個你可以安全使用==比較花車的案例。

嘗試若有所思命名功能。 integer不給任何線索它實際上確實,所以我改變了函數的名稱更有意義。

對未來來說,測試一個數是否是整數應該是感覺就像是一個非常簡單的操作,所以你應該有強烈的感覺,最好的解決方案會非常簡單。我希望你意識到你原來的解決方案是荒謬的,原因很多(最大的原因是:它會導致絕大多數情況下堆棧溢出)。

+1

如果'floor'是'雙樓(雙),這可能無法正常工作'定義''。對這個'floor'的調用會將'k'強制轉換爲double,並且該函數將會以double的形式返回floor。在這裏使用'float floorf(float)'會更好,甚至更好的使用''中的'std :: floor(float)'。 –

+0

另一個潛在的問題是負數,其中「floor」離開零。最安全的解決方案是'返回std :: floor(std :: abs(k))== std :: abs(k)'。 –

+7

爲什麼會導致問題?如果它是不可或缺的,它將不會被舍入。如果它不是*積分,只要它不等於原來的東西,那麼它在哪裏變圓都沒有關係,它不可以。 – tenfour

5

這是行不通的,因爲對於足夠大的花車,x-1 == x

應測試浮動的位模式來檢查小數部分是否爲0

+0

此外,遞歸應該避免在這裏,這是一個非常緩慢的方法,不只是x +/- 1 == x for | x | - > inf。 –

+2

...幾乎在任何情況下都會導致堆棧溢出。 – tenfour

11

爲什麼不只是做這樣的事情:

bool integer(float k) 
{ 
    return k == (float)(int)k; 
} 

(隨意使用正確的C++課程的類型轉換。)

+0

請注意,這將返回'false'以獲得足夠大的整數(如1e100)。 (不是說用戶想要什麼,其實可能在花車的一般意義。) – Mat

+0

真(除了你不能真正代表1e100爲單精度浮點數!) - 我想這是好足夠的> 99%用例雖然。 –

+1

@Mat:實際上它是未定義行爲k'(在幅度上大於約'INT_MAX')的'足夠大的值。 –

1

其limit.h宏設置爲INT_MAX(最大)或INT_MIN(最小)的整數

正確答案

bool integer(float k) 
    { 
     if(k == (int) k) return true; 
     return false; 
    } 
+0

你是否確實建議他在他的功能中使用這些常量?你有沒有看到它的作用? – tenfour

+0

沒有,用戶被要求..上限和下限: - /所以我給的答案..相應提升 –

0

你可以只使用升壓詞彙鑄頭

bool isinteger(float k){ 
    try{ 
     int tmp = boost::lexical_cast<int>(k); 
     (void*) tmp; 
     return true; 
    }catch(boost::bad_lexical_cast &c){ 
    return false; 
    } 
+0

功能感興趣 –

1

我們可以使用trunc方法從文件math.h

#include <math.h> 

inline bool IsInt(float n) 
{ 
    return !(n - trunc(n)); 
} 
-1

那麼,爲什麼不這樣?

#include <iostream> 
using namespace std; 
bool is_integer(float check){ 
     if (int(check) == check) 
       return true; 
     else return false; 
} 
int main() 
{ 
     float input; 
     cin >> input; 
     if (is_integer(input)) 
     cout << endl << "It's an integer"; 
     else cout << endl <<" Not an integer"; 
     return 0; 
} 
+1

你的答案'INT(檢查)的要點== check'是在其他的答案已經存在,並且不添加任何新 – WorldSEnder

+0

好!我的錯,我沒有看到其他帖子。 -_- – user5864689

-1

下載下面的頭文件
checkVar.h
現在寫你的cpp源代碼一樣

#include <iostream> 
#include "checkVar.h" 
using namespace std; 
int main(){ 
int num; 
cout << "Enter a number : "; 
cin >> num; 
if (check.ifInt(num)==1) 
{ 
cout << "Integer"; 
}else{ 
cout << "Not integer"; 
} 
/* 
You can also check for float by using check.ifFloat(num) 
*/ 
} 

請注意,你必須保持checkVar.h與活躍CPP源文件一起:)

+1

答案應該解釋結果如何實現並且是自包含的。鏈接到外部文件,而不詳細說明鏈接標題中完成了什麼,可以從我這裏得到讚揚。 – WorldSEnder