Board logo

標題: 第六十四題:身分證認證 確認一組身分證號碼是否合法?? [打印本頁]

作者: stephen    時間: 2010-3-27 10:47     標題: 第六十四題:身分證認證 確認一組身分證號碼是否合法??

第六十四題:身分證認證【壹】【貳】    確認一組身分證號碼是否合法??
身分證公式 : http://my.so-net.net.tw/idealist/Other/SSN.html
作者: b1081081    時間: 2010-3-27 22:06

老師,如果你有每天來檢查的話,請幫幫我批改一下唄>ˇ<
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <string>
  4. using namespace std;
  5. int main(void){
  6.    
  7.     string num;
  8.     int id_change[26] = {10,11,12,13,14,15,16,17,34,18,19,20,
  9.     21,22,35,23,24,25,26,27,28,29,32,30,31,33};
  10.     int all[8] = {0,0,0,0,0,0,0,0};
  11.     int end_all = 0;
  12.     int first = 0;
  13.    
  14.     cout << "請輸入身分證號碼" << endl;
  15.     cin >> num;
  16.    
  17.     if((int)num[0] >= 97 && (int)num[0] <= 122){
  18.           (int)num[0]-32;               
  19.     }
  20.    
  21.     first = ((id_change[(int)(num[0]-65)] % 10) * 9) +
  22.     (((id_change[(int)(num[0]-65)]) - (id_change[(int)(num[0]-65)] % 10)) / 10);
  23.    
  24.     all[7] = ((int)num[8] - 48);
  25.     all[6] = ((int)num[7] - 48)* 2;
  26.     all[5] = ((int)num[6] - 48)* 3;
  27.     all[4] = ((int)num[5] - 48)* 4;
  28.     all[3] = ((int)num[4] - 48)* 5;
  29.     all[2] = ((int)num[3] - 48)* 6;
  30.     all[1] = ((int)num[2] - 48)* 7;
  31.     all[0] = ((int)num[1] - 48)* 8;
  32.    
  33.     end_all = (first + all[7] + all[6] + all[5] + all[4] +
  34.     all[3] + all[2] + all[1] + all[0]) % 10;
  35.    
  36.     if(end_all == 0){
  37.                end_all = 0;
  38.     }else{
  39.                end_all = 10 - ((first + all[7] + all[6] + all[5] + all[4] +
  40.                all[3] + all[2] + all[1] + all[0]) % 10);
  41.     }
  42.    
  43.     if(end_all == (int)num[9] - 48){
  44.                cout << "這是合法的身分證號碼" << endl;
  45.     }else{
  46.                cout << "這不是合法的身分證號碼" << endl;
  47.     }

  48.     system("pause");
  49.     return 0;
  50. }
複製代碼

作者: chuangjoy    時間: 2010-4-2 20:17

回復 2# b1081081


    看了好累喔~~我快掛了...........
    因為我真的看不懂...........
作者: p17johnny    時間: 2010-4-24 10:45

大概用好了```
作者: b1081081    時間: 2010-4-24 10:46

老師 這是身分證製造器 我自己寫的 看一下唄
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. int main(void){
  5.    
  6.     srand(time(NULL));
  7.     int id_change[26] = {10,11,12,13,14,15,16,17,34,18,19,20,
  8.     21,22,35,23,24,25,26,27,28,29,32,30,31,33};
  9.     int id[10];
  10.     int where;
  11.     int sex;
  12.    
  13.     cout << "請選擇居住地區:   1:台北市  2:台中市  3:基隆市  4:台南市  5:高雄市" << endl;
  14.     cout << "6:台北縣  7:宜蘭縣  8:桃園縣  9:嘉義市  10:新竹縣  11:苗栗縣" << endl;
  15.     cout << "12:台中縣  13:南投縣  14:彰化縣  15:新竹市  16:雲林縣  17:嘉義縣" << endl;
  16.     cout << "18:台南縣  19:高雄縣  20:屏東縣  21:花蓮縣  22:台東縣  23:金門縣" << endl;
  17.     cout << "24:澎湖縣  25:陽明山  26:連江縣" << endl;
  18.     cin >> where;
  19.    
  20.     id[0] = (where + 64);
  21.    
  22.     cout << "請輸入性別:  1:男性 2:女性" << endl;
  23.     cin >> sex;
  24.    
  25.     id[1] = sex;
  26.    
  27.     test:
  28.    
  29.     int all[8] = {0,0,0,0,0,0,0,0};
  30.     int end_all = 0;
  31.     int first = 0;
  32.     int again = 0;
  33.    
  34.     for(int i = 2; i < 10; i++){
  35.     id[i] = (rand()%10);
  36.     }
  37.    
  38.     first = ((id_change[(id[0]-65)] % 10) * 9) +
  39.     (((id_change[(id[0]-65)]) - (id_change[(id[0]-65)] % 10)) / 10);
  40.    
  41.     all[7] = id[8];
  42.     all[6] = (id[7] * 2);
  43.     all[5] = (id[6] * 3);
  44.     all[4] = (id[5] * 4);
  45.     all[3] = (id[4] * 5);
  46.     all[2] = (id[3] * 6);
  47.     all[1] = (id[2] * 7);
  48.     all[0] = (id[1] * 8);
  49.    
  50.     end_all = (first + all[7] + all[6] + all[5] + all[4] +
  51.     all[3] + all[2] + all[1] + all[0]) % 10;
  52.    
  53.     if(end_all == 0){
  54.           end_all = 0;
  55.     }else{
  56.           end_all = 10 - ((first + all[7] + all[6] + all[5] + all[4] +
  57.           all[3] + all[2] + all[1] + all[0]) % 10);
  58.     }
  59.    
  60.     if(end_all == id[9]){
  61.           cout << (char)id[0] << id[1];
  62.           cout << id[2] << id[3] << id[4] << id[5]<< id[6] << id[7] << id[8] << id[9] << endl;
  63.           cout << "還要再產生一組身分證嗎? 1:Yes 2:No" << endl;
  64.           cin >> again;
  65.           if(again == 1){
  66.                 goto test;
  67.           }else if(again == 2){
  68.                 cout << "再見!!" << endl;            
  69.           }
  70.     }else{
  71.           goto test;
  72.     }

  73.     system("pause");
  74.     return 0;
  75. }
複製代碼

作者: chuangjoy    時間: 2010-4-27 20:49

回復 5# b1081081


    反正只要能執行就好了唄~~
作者: johnsom127    時間: 2010-8-19 15:10

本帖最後由 johnsom127 於 2010-8-24 15:19 編輯

版權所有 請勿翻印
翻印者須負法律責任
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <math.h>
  4. using namespace std;
  5. int main(void){
  6.     char town;
  7.     int sex;
  8.     int check[26] = { 10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21,
  9.                       22, 35, 23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33};
  10.     while(cout <<"請輸入居住城市代碼 : "<<endl
  11.                <<"A台北市 J新竹縣 S高雄縣 B台中市 K苗栗縣 T屏東縣 C基隆市 L台中縣 U花蓮縣"<<endl
  12.                <<"D台南市 M南投縣 V台東縣 E高雄市 N彰化縣 W金門縣 F台北縣 O新竹市 X澎湖縣"<<endl
  13.                <<"G宜蘭縣 P雲林縣 Y陽明山 H桃園縣 Q嘉義縣 Z連江縣 I嘉義市 R台南縣"<<endl){
  14.                
  15.                string id;
  16.                srand(time(NULL)); // 下亂數種子
  17.                cin >>town;
  18.                if(town >=97 &&town <=122){
  19.                        id +=town-32;        
  20.                }else if(town >=65 &&town <=90){
  21.                      id +=town;      
  22.                }else{
  23.                      for(int i=0;i<1001;i++){
  24.                              cout<<"恭喜你中獎了!!";
  25.                      }
  26.                      cout<<"請重新輸入";      
  27.                }
  28.                cout <<"請輸入性別 : (1:男 2:女)";
  29.                cin >> sex;
  30.                if(sex ==1){
  31.                       id +='1';
  32.                }else if(sex ==2){
  33.                      id +='1';
  34.                }else{
  35.                      for(int i=0;i<1001;i++){
  36.                              cout<<"恭喜你中獎了!!";
  37.                      }
  38.                      cout<<"請重新輸入";
  39.                }
  40.                for (int i = 1; i <= 7; i++){
  41.                         id += (char)((rand()*15217%10)+48);
  42.                }
  43.                cout <<id
  44.                     <<10-((check[id[0]-64]/10 + check[id[0]-64]%10*9 + (id[2]-48)*8+
  45.                     + (id[3]-48)*7+ (id[4]-48)*6+ (id[5]-48)*5
  46.                     + (id[6]-48)*4+ (id[7]-48)*3+ (id[8]-48)*2+ (id[9]-48))%10)
  47.                     +(((check[id[0]-64]/10 + check[id[0]-64]%10*9 + (id[2]-48)*8+
  48.                     + (id[3]-48)*7+ (id[4]-48)*6+ (id[5]-48)*5
  49.                     + (id[6]-48)*4+ (id[7]-48)*3+ (id[8]-48)*2+ (id[9]-48))%10) ==0)*(-10)
  50.                     <<endl<<"___________________________________________________________"<<endl;
  51.                                 
  52.     }
  53. system("pause");
  54. return 0;
  55. }
複製代碼

作者: Alen    時間: 2010-8-20 11:42

  1. /* a020: 身分證檢驗  */
  2. #include <iostream>
  3. #include <cstdlib>
  4. using namespace std;
  5. int main(void){
  6.     string id; // 取得使用者輸入字串
  7.     int code[10]; //存放加權後各組數字
  8.     int total; // 存放加權數字總合
  9.     int user; // 將字母轉換成地區代碼
  10.     int num; // 存放驗證碼
  11.     int check[26] = { 10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21,
  12.                       22, 35, 23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33};
  13.     while (cin >> id){
  14.           total = 0;//將 total 初始化
  15.           num = 0;//將 num 初始化
  16.           if (id[0] >= 65 && id[0] <= 90){ //大寫
  17.              user = id[0]-65; //取得陣列位置
  18.           }else if(id[0] >= 97 && id[0] <= 122){ //小寫
  19.                 user = id[0]-97; //取得陣列位置
  20.           }
  21.           /*開始求權數(字母部分)*/
  22.           code[0] = check[user] / 10 * 1;
  23.           code[1] = check[user] % 10 * 9;
  24.    
  25.           /* 開始求權數(整數部份) */
  26.           /*code[2] = (id[1]-48) * 8;
  27.           code[3] = (id[2]-48) * 7;
  28.           code[4] = (id[3]-48) * 6;
  29.           code[5] = (id[4]-48) * 5;
  30.           code[6] = (id[5]-48) * 4;
  31.           code[7] = (id[6]-48) * 3;
  32.           code[8] = (id[7]-48) * 2;
  33.           code[9] = (id[8]-48) * 1;*/
  34.           for (int i = 1; i <=8; i++){
  35.               code[i+1] = (id[i]-48) * (9-i);
  36.           }
  37.           /* 將權數相加存入 total */
  38.           for (int i = 0; i < 10; i++){
  39.               total += code[i];
  40.           }
  41.          
  42.           /*檢查流水號是否等於驗證碼*/
  43.           num = 10 - (total % 10);
  44.          
  45.           if (num == (id[9]-48)){
  46.              cout << "real" << endl;        
  47.           }else{
  48.                 cout << "fake" << endl;     
  49.           }

  50.                     


  51.          }
  52.     //system("pause");
  53.     return 0;
  54. }
複製代碼





歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/) Powered by Discuz! 7.2