#8696: 看別人的寫法 不太了解


s111159 (奈)

學校 : 國立中央大學
編號 : 35129
來源 : [140.115.202.150]
最後登入時間 :
2018-10-20 11:10:04
a020. 身分證檢驗 | From: [203.64.191.2, 192.168.4.101] | 發表日期 : 2014-03-07 17:51

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
    char string[10]; //宣告陣列 10個元素 
    scanf("%s",&string); //接受string的內容 %s只取字串(開頭英文 
    int Letter=0,num=0,i=1,j=8;  
        switch(string[0])
        {
            case 'A':
                Letter=10;
                break;
            case 'B':
                Letter=11;
                break;
            case 'C':
                Letter=12;
                break;
            case 'D':
                Letter=13;
                break;
            case 'E':
                Letter=14;
                break;
            case 'F':
                Letter=15;
                break;
            case 'G':
                Letter=16;
                break;
            case 'H':
                Letter=17;
                break;
            case 'I':
                Letter=34;
                break;
            case 'J':
                Letter=18;
                break;
            case 'K':
                Letter=19;
                break;
            case 'L':
                Letter=20;
                break;
            case 'M':
                Letter=21;
                break;
            case 'N':
                Letter=22;
                break;
            case 'O':
                Letter=35;
                break;
            case 'P':
                Letter=23;
                break;
            case 'Q':
                Letter=24;
                break;
            case 'R':
                Letter=25;
                break;
            case 'S':
                Letter=26;
                break;
            case 'T':
                Letter=27;
                break;
            case 'U':
                Letter=28;
                break;
            case 'V':
                Letter=29;
                break;
            case 'W':
                Letter=32;
                break;
            case 'X':
                Letter=30;
                break;
            case 'Y':
                Letter=31;
                break;
            case 'Z':
                Letter=33;
                break;
        
    }
    num= Letter/10 + (Letter%10)*9; //身分證規則 英文部分 
        for(i;i<9;i++) //讓迴圈跑8次 
        {
            num=num+(string[i]-48)*j; //身分證規則  
            j--;
        } 
        num=num+string[9]-48;
        if(num%10==0)
        cout << "real" << endl;
        else
        cout << "fake" << endl;
        
    system("pause");
}
 
為何那兩行紅色的指令最後都要-48呢? 
 
#8700: Re:看別人的寫法 不太了解


crazytim (天邊)

學校 : 臺北市立成功高級中學
編號 : 35518
來源 : [36.229.95.202]
最後登入時間 :
2023-06-26 22:46:23
a020. 身分證檢驗 | From: [111.240.22.232] | 發表日期 : 2014-03-08 23:37


    num= Letter/10 + (Letter%10)*9; //身分證規則 英文部分 
        for(i;i<9;i++) //讓迴圈跑8次 
        {
            num=num+(string[i]-48)*j; //身分證規則  
            j--;
        } 
        num=num+string[9]-48;
        if(num%10==0)
        cout << "real" << endl;
        else
        cout << "fake" << endl;
        
    system("pause");
}
 
為何那兩行紅色的指令最後都要-48呢? 


不曉得你知不知道ascii碼?

你可以上網搜尋

簡單來說 每一個符號(包括數字&英文字母)都有一個ascii編碼

而紅色那部分 他用意是把char型態的數字 轉換成int型態 

例:

char  a='1'; 

而字元'1'的ascii碼 等於 49

所以當我們把 a-48 這樣的運算式傳給電腦時

電腦會自動把變數a視為一個數值

這個數就是a裡面儲存的字元的ascii碼(也就是49)

最後就可以得到 49-48=1

 

看起來沒有太大用處

但事實上這個技巧很實用的! 

 

 
ZeroJudge Forum