题目描述如今出版的大多数书籍都被分配了一个唯一标识该书的代码。国际标准书号ISBN\texttt{ISBN}ISBN通常是101010位十进制数字的序列但在某些情况下大写字母X\texttt{X}X也可作为第101010位出现。ISBN\texttt{ISBN}ISBN中可能在不同位置包含连字符以便于阅读但没有其他意义。样例输入和输出展示了ISBN\texttt{ISBN}ISBN的多种合法和非法形式。实际上ISBN\texttt{ISBN}ISBN中只有前999位数字用于标识书籍。第101010个字符作为校验位用于验证前999位数字是否正确。校验位的选择使得按照下述算法计算的值能被111111整除。由于校验位有时可能需要达到101010才能保证被111111整除ISBN\texttt{ISBN}ISBN设计者选择了一个特殊符号来代表101010这就是X\texttt{X}X的作用。ISBN\texttt{ISBN}ISBN校验算法计算两个和s1s1s1和s2s2s2其中s2s2s2是每个数字加入s1s1s1后的部分和的总和。如果最终s2s2s2的值能被111111整除则ISBN\texttt{ISBN}ISBN正确。以正确的ISBN\texttt{ISBN}ISBN0-13-162959-X为例ISBN\texttt{ISBN}ISBN中的数字部分和s1s1s100000011111133344411155566611111122213131399922222255527272799936363610(X)10 (X)10(X)464646s2s2s2是所有部分和的总和0 1 4 5 11 13 22 27 36 46 165165165165能被111111整除因此ISBN\texttt{ISBN}ISBN正确。输入格式输入文件每行包含一个ISBN\texttt{ISBN}ISBN候选字符串前后可能有额外的空格。每行不超过808080个字符。候选字符串可能包含非法字符也可能多于或少于所需的101010位数字。输入以文件结束符EOF\texttt{EOF}EOF结束。输出格式对于每个候选ISBN\texttt{ISBN}ISBN输出该字符串去除前后空格以及判断结果correct或incorrect。样例输入0- 89237- 010- 6 0- 8306- 3637- 4 0- 06- 017758- 6 This_is_garbage 1- 56884- 030- 6 0- 8230- 2571- 3 0- 345- 31386- 0 0- 671- 88858- 7 0- 8104- 5687- 7 0- 671- 74119- 5 0- 812- 52030- 0 0- 345- 24865- 1- 150 0- 452- 26740- 4 0- 13- 139072- 4 0- 1315- 2447- X样例输出0- 89237- 010- 6 is correct. 0- 8306- 3637- 4 is correct. 0- 06- 017758- 6 is correct. This_is_garbage is incorrect. 1- 56884- 030- 6 is correct. 0- 8230- 2571- 3 is correct. 0- 345- 31386- 0 is correct. 0- 671- 88858- 7 is correct. 0- 8104- 5687- 7 is correct. 0- 671- 74119- 5 is correct. 0- 812- 52030- 0 is correct. 0- 345- 24865- 1- 150 is incorrect. 0- 452- 26740- 4 is correct. 0- 13- 139072- 4 is correct. 0- 1315- 2447- X is correct.题目分析问题的本质这是一个字符串解析 校验和计算问题。需要从包含可能连字符和空格的字符串中提取出101010个有效字符数字或X\texttt{X}X然后计算加权和校验。ISBN\texttt{ISBN}ISBN的组成前999位数字0∼90 \sim 90∼9第101010位数字0∼90 \sim 90∼9或大写字母X\texttt{X}X代表101010格式要求连字符可以出现在任意位置忽略不计空格可以出现在前后或中间但需要去除首尾空格后输出原字符串无效字符字母、标点等会导致ISBN\texttt{ISBN}ISBN非法数字数量必须恰好为101010X\texttt{X}X只能出现一次且只能出现在最后一位隐含条件由算法自动判断校验算法设提取出的有效数字为d1,d2,…,d10d_1, d_2, \dots, d_{10}d1​,d2​,…,d10​其中di∈[0,9]d_i \in [0,9]di​∈[0,9]d10d_{10}d10​可以为101010X\texttt{X}X。定义s1i∑k1idk s1_i \sum_{k1}^{i} d_ks1i​k1∑i​dk​s2∑i110s1i s2 \sum_{i1}^{10} s1_is2i1∑10​s1i​ISBN\texttt{ISBN}ISBN合法当且仅当恰好有101010个有效数字如果有X\texttt{X}X它必须是最后一个有效数字s2 mod 110s2 \bmod 11 0s2mod110参考代码// Recongnizing Good ISBNs// UVa ID: 333// Verdict: Accepted// Submission Date: 2016-06-28// UVa Run Time: 0.050s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intmain(intargc,char*argv[]){ios::sync_with_stdio(false);string line;while(getline(cin,line)){intterm0;// 当前部分和 s1intsum0;// 所有部分和的总和 s2boolcorrecttrue;intcounter0;// 有效数字计数intindexer0;// 字符位置计数intdigitIndex-1;// 最后一个数字的位置intxIndex-1;// X 出现的位置// 扫描每个字符for(autoc:line){indexer;// 1-based 位置计数if(isdigit(c)){counter;digitIndexindexer;termc-0;// 更新 s1sumterm;// 累加到 s2}elseif(cX){counter;// X 只能出现一次if(xIndex-1)xIndexindexer;else{correctfalse;break;}term10;// X 代表 10sumterm;}// 如果已经超过 10 位有效数字提前终止if(counter10)break;}// 判断有效数字数量是否正确以及 X 是否在最后一位if(counter!10||(xIndex0xIndexdigitIndex))correctfalse;// 去除原字符串的首尾空格用于输出intleft0,rightline.length()-1;while(leftline.length()isblank(line[left]))left;while(right0isblank(line[right]))right--;for(intileft;iright;i)coutline[i];// 输出判断结果if(!correct)cout is incorrect.\n;elseif(sum%110)cout is correct.\n;elsecout is incorrect.\n;}return0;}