[C_ST26-易] 信用卡卡號檢查
問題描述 :
已知某信用卡號公司的信用卡卡號的規則為16個數(共1~16位),奇數位乘上1,偶數位乘上2,得到16個數,再將這16個數分別把十位數加上個位數(Ex:15->1+5=6),再產生16個新的數字,最後把這16個數字加總,若能夠被10整除則為正確卡號。
輸入說明 :
輸入一筆信用卡卡號資料。
※長度<=20
輸出說明 :
若輸入資料並非16位數則輸出「Error」,若檢查結果為正確的信用卡卡號則輸出Y,反之輸出N。
範例 :
已知某信用卡號公司的信用卡卡號的規則為16個數(共1~16位),奇數位乘上1,偶數位乘上2,得到16個數,再將這16個數分別把十位數加上個位數(Ex:15->1+5=6),再產生16個新的數字,最後把這16個數字加總,若能夠被10整除則為正確卡號。
輸入說明 :
輸入一筆信用卡卡號資料。
※長度<=20
輸出說明 :
若輸入資料並非16位數則輸出「Error」,若檢查結果為正確的信用卡卡號則輸出Y,反之輸出N。
範例 :
Sample Input: | Sample Output: |
4048726835405438 | Y |
- #include <iostream>
- #include <string.h>
- #include <cmath>
- using namespace std;
- int main() {
- // [C_ST26-易] 信用卡卡號檢查
- string card_num;
- int len = 0;
- while(cin >> card_num)
- {
- int sum = 0; //最後16位的總和(除10的那個數)
- len = card_num.size(); //字串長度,判斷幾位數
- char card[len]; //string to char,存放字元陣列card裡
- bool Err = true; //旗標值
- strcpy(card, card_num.c_str()); //string to char
- if(len != 16) //不是16位,輸出Error
- {
- cout << "Error" << endl;
- }
- else //是16位
- {
- for(int i = 1;i <= len;i++) //項數
- {
- if(48 <= card[i-1] && card[i-1] <= 57) //判斷是否是數字,在此範圍內的是ASCII的0~9
- {
- if(i % 2 != 0)//奇數
- {
- sum = sum + card[i-1]; //加總
- }
- else //偶數
- {
- //注意現在的card[i]是char,char to int 就是以下方法
- card[i-1] = floor((((int)card[i-1]-48)*2)/10)+((((int)card[i-1]-48))*2)%10;
- sum = sum + ((int)card[i-1]-48);
- }
- }
- else
- {
- cout << "Error" << endl;
- Err = false;
- break;
- }
- }
- if(Err == true)
- {
- if(sum % 10 == 0)
- {
- cout << "Y" << endl;
- }
- else
- {
- cout << "N" << endl;
- }
- }
- else
- {
- break;
- }
- }
- }
- return 0;
- }
沒有留言:
張貼留言