2015-09-25 94 views
3

我正在嘗試創建一個函數,它能夠計算任何數字的校驗和,包括浮點數。計算點數的校驗和

例如:

360° = 3+6+0 = 9 
180° = 1+8+0 = 9 
90° = 9+0 = 9 
45° = 4+5 = 9 
22.5° = 2+2+5 = 9 
11.25° = 1+1+2+5 = 9 
5.625° = 5+6+2+5 = 18 = 1+8 = 9 
2.8125° = 2+8+1+2+5 = 18 = 1+8 = 9 
1.40625 = 1+4+0+6+2+5 = 18 = 1+8 = 9 
0.703125 = 0+7+0+3+1+2+5 = 18 = 1+8 = 9 
0.3515625 = 0+3+5+1+5+6+2+5 = 27 = 2+7 = 9 
0.17578125 = 0+1+7+5+7+8+1+2+5 = 36 = 3+6 = 9 
... 

我寫了這個小碼,其計算整數的校驗:

#include<iostream> 
using namespace std; 

int checksum(int param) 
{ 
    int sum = 0; 

    while (param > 0) 
    { 
     sum += param % 10; 
     param /= 10; 
    } 

    while (sum > 9) { sum = checksum(sum); } 

    return sum; 
} 

int main() 
{ 
    int number = 0; 

    cout<<"Enter number:"<<endl; 
    cin>> number; 

    cout<< checksum(number); 

    cin.get(); cin.get(); 
    return 0; 
} 

我怎樣才能改進它,所以它也與浮點數工程?

背景

我試圖找出如果這是真的,從我的例子格局將永遠繼續的9校驗結果。

更新

Unfortunattely C++是不是這個項目不夠精確。例如。如果我計算0.703125/2那麼結果將是0.3515625,但在C++中的結果是0.351563。 我的代碼:http://www.pasteall.org/61345/cpp

+0

它看起來像任何負參數將產生0的校驗和這是打算? –

+2

你爲什麼不從位表示中創建校驗和? –

+0

你想要380,180,38,18,9和90都具有相同的校驗和嗎?爲什麼?! –

回答

1

比方說您要計算校驗和高達浮點數的5小數點然後只需100000乘以你的浮點數,並採取「地板」然後計算校驗和與你的函數。

編輯

由於float和double有進動問題,最好不要用它們來計算校驗和更多的數字(15位雙)。更多數字使用浮點數的字符串表示形式。

1

我從來沒有聽說過實數校驗和,通過總和數字。你應該採用二進制表示法,4或8個字節,並對它們進行求和。這將會有實際意義。

0

我能夠通過myselve解決它。

輸入:1.97654

輸出:The checksum of 1.97654 is 5

#include<iostream> 
#include<sstream> 
#include<string> 
#include<math.h>  /* pow */ 
using namespace std; 

int checksum(int param) 
{ 
    int sum = 0; 


    while (param > 0) 
    { 
     int r1 = param % 10; 
     sum += r1; 
     param /= 10; 
    } 

    while (sum > 9) { sum = checksum(sum); } 

    return sum; 
} 

int main() 
{ 
    string number; 
    cout<<"Enter number:"<<endl; 
    cin>> number; 

    double param_as_double  = stod(number); 
    int front_part    = stoi(number); 

    double after_point_part = param_as_double - front_part; 

    ostringstream strs; 
    strs << after_point_part; 
    string after_point_part_str = strs.str(); 


    int nachkomma_len = after_point_part_str.length()-1; 

    after_point_part *= pow(10.00,nachkomma_len-1); 

    strs.str(""); 
    strs << after_point_part; 
    after_point_part_str = strs.str(); 

    int after_point_part_int  = stoi(after_point_part_str); 

    int SUM = 0; 

    SUM = checksum(front_part); 
    SUM += checksum(after_point_part_int); 
    SUM = checksum(SUM); 

    cout<<"The checksum of "<<number<<" is "<< SUM <<endl; 

    cin.get(); cin.get(); 
    return 0; 
} 

大概是那麼多的代碼必須的,但我累了,爲此懶得改進。我沒有足夠的時間來測試它的錯誤,所以即時通訊不知道它是否工作100%。

+1

請告訴我,這是一個類,而不是一個真實世界的應用程序。 –

+0

這不計算浮點校驗和,它計算字符串的校驗和。 –

+0

我編輯了標題,我正在談論點數。我是德國人,並不知道它的正確詞彙。 – Black