2008年8月2日 星期六

Q10696: f91


題目:http://luckycat.kshs.kh.edu.tw/homework/q10696.htm


出處 :
ACM



McCarthy是一個有名的資訊專家。他定義了一個遞迴的函數叫做 f91 。它輸入一個正整數N並且依據以下的規則傳回一個正整數:



  • 如果 N <= 100, 那麼 f91(N) = f91( f91( N+11) )
  • 如果 N >= 101, 那麼 f91(N) = N-10


請你寫一個程式來計算 f91


首先,我用手算了很久,得到一個結論:這不是給人算的!

題目的意思應該是讓我們利用遞迴函數讓電腦算

結果,意外的簡單,第一次就獲得AC (Accepted)




方法很簡單,跟隨題目製作一個f91函數就可以順利完成了:

/*
Name: Q10696 f91
Author: yi_lin
Language: C programmer
Date: 28/07/08 23:17
*/

#include <stdio.h>

int f91(int a)
{
int b;
if(a<=100) b=f91(f91(a+11));
else if(a>=101) b=a-10;

return b ;
}

int main()
{
int N,t;
while(1){
scanf("%d",&N);
if(N==0) break;
t=f91(N);

printf("f91(%d) = %d\n",N,t);

}
return 0;

}


不過,使用遞迴函數會大幅的降低執行效率

ZeroJudge - an Online Judge System For Beginners



網站名稱:
ZeroJudge  高中生程式解題系統
網站網址:http://cat.nknush.kh.edu.tw/ZeroJudge



這是最近發現的網站,類似ACM Online Judge,不過提供了更簡單的題目,因此稱為 ZeroJudge。
歡迎屏中的各位一起提升屏中排名,榮耀屏中!

a020 身分證檢驗



題目:



我國的身分證字號有底下這樣的規則,因此對於任意輸入的身分證字號可以有一些基本的判斷原則,請您來判斷一個身分證字號是否是正常的號碼(不代表確有此號、此人)。



  1. 英文代號以下表轉換成數字

  2.       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 台南縣


  3. 英文轉成的數字, 個位數乘9再加上十位數的數字

  4. 各數字從右到左依次乘1、2、3、4....8

  5. 求出  2. 、 3.  及 最後一碼的和

  6. 4. 除10 若整除,則為 real,否則為 fake



例: T112663836


2 + 7*9 + 1*8 + 1*7 + 2*6 + 6*5 + 6*4 + 3*3 + 8*2 + 3*1 + 6 = 180


除以 10 整除,因此為 real


 




我的做法是:寫一個CharToInt函數將英文轉為對應數字,最後傳回main函數做運算。


/*
Name: a020 身分證檢驗
Author: yi_lin
Language: C programmer
Date: 03/08/08 00:54
*/

#include<stdio.h>

int CharToInt(char c)
{
switch(c){
case 'A':
return 10;
case 'B':
return 11;
case 'C':
return 12;
case 'D':
return 13;
case 'E':
return 14;
case 'F':
return 15;
case 'G':
return 16;
case 'H':
return 17;
case 'I':
return 34;
case 'J':
return 18;
case 'K':
return 19;
case 'L':
return 20;
case 'M':
return 21;
case 'N':
return 22;
case 'O':
return 35;
case 'P':
return 23;
case 'Q':
return 24;
case 'R':
return 25;
case 'S':
return 26;
case 'T':
return 27;
case 'U':
return 28;
case 'V':
return 29;
case 'W':
return 32;
case 'X':
return 30;
case 'Y':
return 31;
case 'Z':
return 33;
}
}

int main()
{
int i,j;
char a[10];

while(scanf("%s",&a)!=EOF){
i=CharToInt(a[0]);
j=(i/10)+(i%10)*9;
for(i=1;i<9;i++){
j+=(a[i]-'0')*(9-i);
}
j+=a[9]-'0';

if(j%10==0)printf("real\n");
else printf("fake\n");
}
return 0;
}



詳細身分證規則:http://my.so-net.net.tw/idealist/Other/SSN.html



反過來,知道這些規則後也可以很容易的做出身分證製造機