我正在尝试在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
答案 0 :(得分:2)
0
。我的程序同时做到了;解析九个数字的ISBN会返回预期的校验位(其中10
的值应该被解释为传统的X
)。0
实际上是&#34;有效&#34;的指示符。#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