我试图在C中验证ISBN-10数字,我的逻辑是,每一个数字乘以它的基数,当求和后,可以被11整除。但是,即使是有效的ISBN数字也得到了rejected.So,我添加了打印语句,我不明白为什么要得到这个输出。谁能给我指明正确的方向?
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发布于 2014-10-16 22:31:53
0。下面的程序两者兼而有之;解析九位数字ISBN返回预期的检查数字(其中10的值应解释为传统的X)。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: 0https://stackoverflow.com/questions/26414616
复制相似问题