作者 主題: 麗山經典程設的幾個題目  (閱讀 4526 次)

0 會員 與 1 訪客 正在閱讀本文。

shang1112

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
麗山經典程設的幾個題目
« 於: 2010-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++寫。

謝謝各位大大相救了
« 上次編輯: 2010-12-06 23:31 由 shang1112 »

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: 麗山經典程設的幾個題目
« 回覆 #1 於: 2010-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)基本上該算式就變得沒有意義了

« 上次編輯: 2010-12-06 01:01 由 stlee »
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

Nansen

  • 活潑的大學生
  • ***
  • 文章數: 212
    • 檢視個人資料
回覆: 麗山經典程設的幾個題目
« 回覆 #2 於: 2010-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;
}

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: 麗山經典程設的幾個題目
« 回覆 #3 於: 2010-12-06 12:08 »
樓上用JS的比較符合提問者的程式邏輯(從後面乘回來)
而我在書上抄的公式是從前面乘

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

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

只是不知道比如S=26的高雄縣用哪一個公式算會正確呢?
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

shang1112

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
回覆: 麗山經典程設的幾個題目
« 回覆 #4 於: 2010-12-07 23:13 »
啊啊,謝謝兩位= D
今天終於把這題寫好了^_^