2014-02-25 87 views
0

在產生在盧恩的算法Luhn算法和在C「位操縱」 ++

校驗位(x)由計算的位數,然後計算9倍值模10的總和所獲得的「校驗位」 (以等式形式,(67 * 9 mod 10))。算法形式:計算數字的總和(67)。 乘以9(603)。最後一位數字3是校驗位。

自然本能指向一個字符串作爲一個字符串,使個人數字操作更容易。但似乎沒有辦法通過stringstream一次提取數字,因爲沒有分隔符(據我所知)。因此,這個過程變成了單個字符到整數的繁瑣轉換...

每個數字方法也有模數,這也需要一些工作。

我想我的目標是我可能忽略了一種更優雅的方式,將輸入和輸入操作看作是單個數字輸入。

+0

轉換個別數字字符整數是不是所有的繁瑣:'INT VAL = digit_char - '0';' –

回答

2

使用模運算簡單地像下面的公式: -

checkdigit = (sum_digits*9)%10 
      = ((sum_digits)%10*9)%10 

現在是非常簡單的使用字符串來評價。

C++實現: -

#include<iostream> 
using namespace std; 

int main() { 

    char* str = new char[100]; 
    cout<<"Enter the String: "; 
    cin>>str; 

    int val = 0; 

    for(int i=0;str[i]!=0;i++) { 

     val = (val+str[i]-'0')%10; 

    } 

    val = (val*9)%10; 

    cout<<"Checkdigit("<<str<<") = "<<val; 
    return 0; 
} 
+0

那個位..str [Ⅰ] - 「0」就是其中之一「我爲什麼沒有想到這個......」男人我覺得自己像個白癡。感謝這個片段。它就像你爲你計算器乘以10倍時的感覺 – EndsOfInvention

0

Stringstream必須計算所有數字,然後通過加'0'將每個數字轉換爲字符。您必須再次減去'0'以獲取數字值。你最好直接使用模數方法。