2008年5月24日 星期六

96 試題一

ISBN(International Standard Book Number)是一種世界共通的書籍編碼方法,世界上任何一本書籍之出版,皆有著唯一的一組ISBN碼。此碼由十個位數組成,每一位數可以為0~9的任何一個數字,或者為X,代表此位數為10;試寫出一個程式來判斷所輸入的ISBN碼是否為合法的。其判斷方法如下,首先,將此ISBN碼的十個位數分開,自左而右依次為第一位數,第二位數至第十位數,接著進行第一次的累加,使得第二位數成為第一位數到第二位數的和,第三位數為第一位數到第三位數的累加和,第十位數為第一位數到第十位數的累加和;進行完第一次的累加和後,接著再依照相同之方法進行第二次的累加動作,我們稱此時最後所求得之累加和為此ISBN碼之識別碼,倘若此識別碼為11的倍數,則此ISBN碼為合法的,故請輸出YES,反之請輸出NO。注意:為便於識別,在此ISBN碼中可能會插入'-'符號,此符號不具任何意義,可以直接忽略它。例如,若輸入之ISBN碼為013-162-959X,則其運算之過成如下表所示:

ISBN碼 0 1 3 1 6 2 9 5 9 10(X)
第一次累加和 0 1 4 5 11 13 22 27 36 46
第二次累加和 0 1 5 10 21 34 56 83 119 165

經由計算可得其識別碼為165,乃是11之倍數,故此為一合法之ISBN碼,因此應該要輸出YES於螢幕上。

試題一解答
試題目錄
回到首頁

1 則留言:

wenhua 提到...

這一題沒有解答可參考,在忽略'-'及x=10部分想了很久終於解出來了。
先宣告一個字串陣列及一個整數陣列。
再來用字串陣列判斷忽略'-'以及輸入X=10,
將解果傳到整數陣列再計算即可。

1.忽略'-':
一開始將字串陣列的容量宣告為10個以上,
再判斷輸入的內容是否為'-',是的話將陣列內容往左移,故需要10個以上的容量來確保有10個數字。
for(i=0;i<20;i++)
{
if(cISBN[i]=='-')
{
for(j=i;j<20;j++)
{
cISBN[j]=cISBN[j+1];
}
}
}

2.判斷輸入'x'or'X'就會=10:
for(i=0;i<10;i++)
{
if(cISBN[i]=='x'||cISBN[i]=='X')
cISBN[i]=10;
}

3.將字串陣列傳到整數陣列:
因為直接傳送數值會不對,所以用switch的方式來判斷及傳送。
for(i=0;i<10;i++)
{
switch(cISBN[i])
{
case '0':
{iISBN[i]=0;break;}
case '1':
{iISBN[i]=1;break;}
.
.
.
case 10:
{iISBN[i]=10;break;}
}
}

4.使用整數陣列計算即可。