酷!學園

其他討論區 => 肉腳版 => 主題作者是: shang1112 於 2010-12-05 18:34

主題: 麗山經典程設的幾個題目
作者: shang11122010-12-05 18:34
初次發文= )我是最近才開始學C語言的高中生,作業寫了很久,就是跑不出來。所以只好發上來,希望大家可以幫幫我,好嗎?> <

題目:
身分證認證
確認一組身分證號碼是否合法??
(1)英文代號以下表轉換成數字
A=10 台北市   J=18 新竹縣   S=26 高雄縣
B=11 台中市   K=19 苗栗縣   T=27 屏東縣
C=12 基隆市   L=20 台中縣   U=28 花蓮縣
D=13 台南市   M=21 南投縣   V=29 台東縣
E=14 高雄市   N=22 彰化縣  * W=32 金門縣
F=15 台北縣  * O=35 新竹市   X=30 澎湖縣
G=16 宜蘭縣   P=23 雲林縣   Y=31 陽明山
H=17 桃園縣   Q=24 嘉義縣  * Z=33 連江縣
* I=34 嘉義市   R=25 台南縣
(2)英文轉成的數字, 個位數乘9再加上十位數
(3)各數字從右到左依次乘1、2、3、4....8
(4)求出(2),(3)之和
(5)求出(4)除10後之餘數,用10減該餘數,結果就是檢查碼,若餘數為0 。檢查碼就是0。

另外兩題我後來跟同學一起解決了。就剩這題,還是不太懂要怎麼用C++寫。

謝謝各位大大相救了
主題: 回覆: 麗山經典程設的幾個題目
作者: stlee2010-12-06 00:40
身分證認證 ....這是俺考丙級之末代BASIC時術科其中一題呀 ;D(現在丙級很像考VB,我那時還沒有乙級可以考,現在很像有乙級考了是考C的)

英文字部份令其為X1,X2其X1為十位數X2為個位數
也就是比如身份證號的第一個英文字母為E則查表後E=14將之拆出X1=1,X2=4

而英文字後面的九位數字部份令其為D1~D9
整個的計算公式為
Y=(X1+9) * (X2+8) * (D1+7) * (D2+6) * (D3+5) * (D4+4) * (D5+3) * (D6+2) * (D7+D8+D9)
以上是我印象中的公式,為什麼說是印象中呢,因為書上的有點不一樣(我那本術科的書還在咧!不然怎麼答這一題呀)
書上的是這樣的:
Y=X1+9 * X2+8 * D1+7 * D2+6 * D3+5 * D4+4 * D5+3 * D6+2 * D7+D8+D9
可能BASIC先乘除後加減順序不太一樣或書上的排版錯誤(還是我記錯了),反正您都試試看,因為我考完就忘了-_-

然後Y能被10整除則此身份證號碼正確
性別判斷:D1只可為1或2,1表男性2表女性

ps.
應該是我印象中的那一個比較正確,因為我試算自己的身份證號時發現數字部份其中有一個0所以加上()該算式才有意義
否則算到0那裡就都歸零了(任何數乘0皆為0)基本上該算式就變得沒有意義了

主題: 回覆: 麗山經典程設的幾個題目
作者: Nansen2010-12-06 09:06
小弟在某專案用JS寫過,大概是這樣 ::)
代碼: [選擇]
function ckssn(ssn){
if(!ssn.match(/[a-zA-Z]{1}[0-9]{9}/)){
return false;
}
var map={'A':'10','B':'11','C':'12','D':'13',
'E':'14','F':'15','G':'16','H':'17',
'I':'34','J':'18','K':'19','L':'20',
'M':'21','N':'22','O':'35','P':'23',
'Q':'24','R':'25','S':'26','T':'27',
'U':'28','V':'29','W':'32','X':'30',
'Y':'31','Z':'33'};
var t=map[ssn.substr(0,1).toUpperCase()];
var tmp=new Array(11);
tmp[0]=(t-t%10)/10;
tmp[1]=t%10;
for(n=2;n<=10;n++){
tmp[n]=ssn.substr(n-1,1);
}
sum=tmp[0];
for(n=9;n>=1;n--){
sum=sum+tmp[10-n]*n;
}
if(sum%10>0){
if(10-(sum%10)==tmp[10]){
return true;
}
}else if(sum%10==0&&tmp[10]==0){
return true;
}
return false;
}
主題: 回覆: 麗山經典程設的幾個題目
作者: stlee2010-12-06 12:08
樓上用JS的比較符合提問者的程式邏輯(從後面乘回來)
而我在書上抄的公式是從前面乘

不過身份字號中的10+1位數(英文字被拆成2位數)只要其中一位數相加後的結果是10
那不管其他位數怎麼相加乘就一定能被10整除

以我的來說D120xxxx39第一個位數的D用我那個公式代換後不管怎麼算一定被10整除
因為D=13而1+9=10所以不管後面怎麼算都正確

只是不知道比如S=26的高雄縣用哪一個公式算會正確呢?
主題: 回覆: 麗山經典程設的幾個題目
作者: shang11122010-12-07 23:13
啊啊,謝謝兩位= D
今天終於把這題寫好了^_^