2015-10-02 98 views
0

我試圖將5位數的郵政編碼轉換爲27位數的條形碼(由0和1組成),反之亦然。條碼的第一個和最後一個數字始終爲1.刪除這些數字後留下25位數字。分成5位數字,從左到右數字編碼值7,4,2,1,0。如果乘以相應的數值並計算總和,我們可以得到第一個郵政編碼。例如,條形碼的25位數字是10100 10100 01010 11000 01001中,郵編將是99504.C++逐個比較整數

1×7 = 7

0×4 = 0

1×2 = 2

0 X 1 = 0

0 X 0 = 0

總和= 9

// main.cpp 

#include <iostream> 
#include <iomanip> 

#include "ZipCode.h" 

using namespace std; 

int main() 
{ 
    ZipCode zip1(99504); 
    ZipCode zip2(12345); 
    ZipCode zip3(67890); 
    ZipCode zip4("100101010011100001100110001"); 
    ZipCode zip5("110100001011100001100010011"); 
    ZipCode zip6("100011000110101000011100101"); 

    cout << "Digits" << "  " << "Bar Code" << endl; 
    cout << zip1.getZipCode() << setw(35) << zip1.getBarCode() << endl; 
    cout << zip2.getZipCode() << setw(35) << zip2.getBarCode() << endl; 
    cout << zip3.getZipCode() << setw(35) << zip3.getBarCode() << endl; 
    cout << endl; 
    cout << zip4.getZipCode() << setw(35) << zip4.getBarCode() << endl; 
    cout << zip5.getZipCode() << setw(35) << zip5.getBarCode() << endl; 
    cout << zip6.getZipCode() << setw(35) << zip6.getBarCode() << endl; 
    return 0; 
} 

現在這是我的問題:在getZipCode(int num){},我如何比較每個整數值並評估爲條形碼?例如,在main()中,它表示ZipCode zip1(99504);。由於99504是一個整數,我如何評估9條碼,然後評估下一個等等?

+2

看一看這個帖子:[?HOWTO分割INT到它的數字(http://stackoverflow.com/questions/4261589/howto-split-a-int-into-its-digits-digit) –

+1

腦死亡方法是sprintf數字和訪問字符... –

+1

請注意,編碼*'0'的位實際上是[奇偶校驗位](https://en.wikipedia.org/wiki/Parity_bit)。 – Jarod42

回答

0

你可以做到以下幾點:

std::string to_bar_code(unsigned int zip_code) 
{ 
    const std::array<std::string, 10> digit {{ 
     "11000", "00011", "00101", "00110", "01001", 
     "01010", "01100", "10001", "10010", "10100" 
    }}; 
    return "1" 
     + digit[(zip_code/10000) % 10] 
     + digit[(zip_code/1000) % 10] 
     + digit[(zip_code/100) % 10] 
     + digit[(zip_code/10) % 10] 
     + digit[zip_code % 10] 
     + "1"; 
} 

int to_zip_code(const std::string& bar_code) 
{ 
    const std::map<std::string, int> digits = { 
     {"11000", 0}, // special case 
     {"00011", 1}, 
     {"00101", 2}, 
     {"00110", 3}, 
     {"01001", 4}, 
     {"01010", 5}, 
     {"01100", 6}, 
     {"10001", 7}, 
     {"10010", 8}, 
     {"10100", 9} 
    }; 
    const std::string bar_digits[5]{ 
     {bar_code, 1, 5}, 
     {bar_code, 6, 5}, 
     {bar_code, 11, 5}, 
     {bar_code, 16, 5}, 
     {bar_code, 21, 5} 
    }; 
    unsigned int res = 0; 
    for (const auto& d : bar_digits) 
    { 
     res *= 10; 
     res += digits.at(d); 
    } 
    return res; 
} 

Live Demo