计算ISBN-10 - 模数在C中不起作用

时间:2014-10-16 21:58:16

标签: c modulus

我正在尝试在C中验证ISBN-10数字。我的逻辑是每个数字乘以它的基数,当求和时可以被11整除。但是,即使有效的ISBN数也会被拒绝。所以我添加了打印语句,我无法理解为什么我得到这个输出。有人能指出我正确的方向吗?

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

1 个答案:

答案 0 :(得分:2)

  1. 你的计算方法错了;例如,请参阅Wikipedia以获取正确的示例。
  2. 无需使用非常大的变量,使用字符串作为输入相当容易。
  3. 您最多可以总结9个数字并检查最后一个数字是否是预期数字,或者检查全部数字10并查看结果是否为0。我的程序同时做到了;解析九个数字的ISBN会返回预期的校验位(其中10的值应该被解释为传统的X)。
  4. 对于10位ISBN,我的程序会返回余数,因此0实际上是&#34;有效&#34;的指示符。
  5. #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