图书都有唯一的ISBN码(书号)标识,ISBN分为10位和13位两种。对于10位的ISBN码,包含9位数字和1位校验码,其格式如“a-bcd-efghi-j”,其中符号“-”是分隔符,字母a,b,……,i代表0,1,……,9中的某位数字,最后一位是校验码(可以为0,1,……,9中的某位数字,也可以是大写字母X)。
对于格式为“a-bcd-efghi-j”的书号,校验码的计算方法如下(参考自百度百科):
将去掉校验码后得到的9位数字依序分别乘以从10,9,8,……,3,2,将其乘积相加得到累加和sum,求余数r=sum%11;若r=0,则校验码为0;否则求11与r的差数d=11-r,若d=10,则以“X”来表示校验码,否则校验码为d。即:
sum=a×10+b×9+c×8+d×7+e×6+f×5+g×4+h×3+i×2,r=sum % 11,若r为0,则校验码为0,否则d=11-r,若d=10,则校验码为大写字母X,否则校验码为d。

例如,对于书号:7-302-56474-4,有
sum=7×10+3×9+0×8+2×7+5×6+6×5+4×4+7×3+4×2=216,r=216 % 11=7,d=11-7=4,因此校验码为4。

请判断输入书号中的校验码是否正确,若正确,则输出“OK”,否则输出更新校验码后的正确书号。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。对于每组测试数据,输入一个字符串代表书号,格式为“a-bcd-efghi-j”。

输出格式:

对于每组测试数据,输出一行,若书号的校验码正确,则输出“OK”,否则输出更新校验码后的正确书号,格式为“a-bcd-efghi-j”。引号不必输出。

输入样例:

1
2
3
2
7-302-56474-4
6-302-57644-3

输出样例:

1
2
OK
6-302-57644-X

解题思路:

使用默认的swap函数交换两个字符串。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
C++
#include<bits/stdc++.h>
using namespace std;

int main(){
int n,sum,count,i,j,k,m;
char a[50];
cin >> n;
for(i = 0 ; i < n ; i++){
cin >> a;
sum = 0; j = 0;
k = 10;
count = 0;
while(count < 9){
if(a[j] >= '0' && a[j] <= '9'){
sum += k*(a[j]-'0');
k--;
count++;
}
j++;
}
int r = sum % 11;
if(r == 0){
m = '0';
}
else
{
int d = 11 - r;
if(d == 10){
m = 'X';
}
else{
m = d + '0';
}
}
if(a[12] == m){
printf("OK\n");
}
else{
a[12] = m;
printf("%s\n",a);
}
}
}