2014-10-16 22 views
0

我想驗證C中的ISBN-10數字。我的邏輯是每個數字乘以它的基數,當總和時可以被11整除。但是,即使有效的ISBN號碼正在被拒絕。所以我添加了打印語句,我不明白爲什麼我得到這個輸出。任何人都可以將我指向正確的方向嗎?計算ISBN-10模數在C中不起作用

int isValid(long long int number){ 
int sum=0, i=0,j=10; 
long long int base=10; 
fflush(stdout); 
printf("num=%ld\n",number); 
while(i<10){ 
    j=number%base; 
    sum += j*(i+1); 
    printf("n=%d i=%d sum=%d\n",j,i,sum); 
    base*=10; 
    i++; 
    } 
return sum%11; 
} 

這裏是爲ISBN打印輸出 - 0321334876

num=321334876 
n=8 i=0 sum=8 
n=88 i=1 sum=184 
n=788 i=2 sum=2548 
n=3788 i=3 sum=17700 
n=13788 i=4 sum=86640 
n=413788 i=5 sum=2569368 
n=6413788 i=6 sum=47465884 
n=96413788 i=7 sum=818776188 
n=696413788 i=8 sum=-1503434312 
n=106479196 i=9 sum=-438642352 
+2

你需要乘以個別*數字*。在你的代碼中,最後一個數字'6'(正確)乘以%10,而前面乘以%100,導致「76」應該是倒數第二個「7」。 (相當混亂,你的示例輸出似乎報告了'88')。你也在某處溢出你的整數,但這只是由於數量太大。 – usr2564301 2014-10-16 22:14:56

+2

Ref:[ISBN-10 check digits](http://en.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-10_check_digits) – chux 2014-10-16 22:19:26

+0

注:可疑代碼應該是'!(sum%11)'。 – chux 2014-10-16 22:21:40

回答

2
  1. 你的計算方法是錯誤的;例如參見Wikipedia以獲得適當的例子。
  2. 無需使用非常大的變量,使用字符串作爲輸入相當容易。
  3. 您可以總計最多9位數字,並檢查最後一位數字是否爲預期數字,或者檢查全部10位數字並查看結果是否爲0。我的計劃如下:解析九號ISBN會返回預期的校驗位(其中值10應被解釋爲傳統的X)。
  4. 對於10位數字的ISBN,我的程序將返回餘數,因此0實際上是「有效」的指標。
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

int isValid (char *isbn) 
{ 
    int sum=0, i=0, j, pos=0; 
    printf("num=%s\n", isbn); 

    while (isbn[pos]) 
    { 
     if (i == 9 && tolower(isbn[pos]) == 'x') 
     { 
      i++; 
      sum += 10*i; 
      printf("n=%d i=%d sum=%d\n",j,i,sum); 
     } else 
     if (isdigit (isbn[pos])) 
     { 
      i++; 
      j = isbn[pos]-'0'; 
      sum += j*i; 
      printf("n=%d i=%d sum=%d\n",j,i,sum); 
     } 
     pos++; 
    } 
    if (i == 9 || i == 10) 
     return sum % 11; 
    return -1; 
} 

int main (int argc, char **argv) 
{ 
    if (argc != 2) 
    { 
     printf ("usage: isbn [isbn number]\n"); 
     return -1; 
    } 
    printf ("checksum: %d\n", isValid (argv[1])); 
    return 0; 
} 

樣品的輸入和輸出(略調試字符串):

> ./isbn 032133487 
checksum: 6 

> ./isbn 0321334876 
checksum: 0 

> ./isbn 1-84356-028-3 
checksum: 0 

> ./isbn 0-8044-2957-X 
checksum: 0