ChuziChen2024 @ 2024-09-22 19:33:36
#include <cstring>
#include <iostream>
using namespace std;
signed main() {
string isbn_code;
int isbn_int[11] = {0};
int check_code = 0;
int cnt = 0, sum = 0;
cin >> isbn_code;
// 转换数据类型
check_code = isbn_code[12] - '0';
for(unsigned int i = 0; i < isbn_code.length(); i++) {
if(isbn_code[i] == '-') { // 跳过
continue;
} else {
isbn_int[++cnt] = isbn_code[i] - '0'; // 加入
// cout << "join number: " << isbn_code[i] - '0' << endl;
}
}
// 检验数据
cnt = 1; // 重置cnt
for(int i = 0; i < 9; i++) {
sum += cnt * isbn_int[i]; // 累计乘积
cnt ++;
}
// cout << "real check number: " << sum % 11 << endl;
if(sum % 11 == 10 && isbn_code[12] == 'X') {
cout << "Right";
} else if (sum % 11 == check_code) {
cout << "Right";
} else if (sum % 11 == 10) {
isbn_code[12] = 'X';
cout << isbn_code;
} else {
isbn_code[12] = (char)(sum % 11 + '0');
cout << isbn_code;
}
return 0;
}
一直都AC不了啊
by ruishou @ 2024-09-22 19:42:33
好麻烦的代码 让我看会
by wjr_jok @ 2024-09-22 19:44:21
@ChuziChen2024
#include <cstring>
#include <iostream>
using namespace std;
signed main() {
string isbn_code;
int isbn_int[11] = {0};
int check_code = 0;
int cnt = 0, sum = 0;
cin >> isbn_code;
// 转换数据类型
check_code = isbn_code[12] - '0';
for(unsigned int i = 0; i < isbn_code.length(); i++) {
if(isbn_code[i] == '-') { // 跳过
continue;
} else {
isbn_int[cnt++] = isbn_code[i] - '0'; // 加入
// cout << "join number: " << isbn_code[i] - '0' << endl;
}
}
// 检验数据
cnt = 1; // 重置cnt
for(int i = 0; i < 9; i++) {
sum += cnt * isbn_int[i]; // 累计乘积
cnt ++;
}
// cout << "real check number: " << sum % 11 << endl;
if(sum % 11 == 10 && isbn_code[12] == 'X') {
cout << "Right";
} else if (sum % 11 == check_code) {
cout << "Right";
} else if (sum % 11 == 10) {
isbn_code[12] = 'X';
cout << isbn_code;
} else {
isbn_code[12] = (char)(sum % 11 + '0');
cout << isbn_code;
}
return 0;
}
第18行 isbn_int[++cnt] = isbn_code[i] - '0';
你是从1开始存的,但是你在累计乘积的时候是从0开始遍历的,所以漏了一位
by wjr_jok @ 2024-09-22 19:45:06
@ChuziChen2024 把 ++cnt
改为 cnt++
即可
by ruishou @ 2024-09-22 19:47:02
其实不用这么麻烦 用循环读到数字就减去'0'变成数字 再计算就好了
判定正确就输出Right
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[14],mod[12]="0123456789X";
scanf("%s",&a);
int i,j=1,t=0;
for(i=0;i<12;i++){
if(a[i]=='-') continue;
t+=(a[i]-'0')*j++;
}
if(mod[t%11]==a[12]) cout << "Right";
else{
a[12]=mod[t%11];
printf("%s",a);
}
return 0;
}
by ruishou @ 2024-09-22 19:50:20
cnt = 1; // 重置cnt
for(int i = 0; i < 9; i++) {
sum += cnt * isbn_int[i]; // 累计乘积
cnt ++;
}
你这段错了喵
改成
cnt = 1; // 重置cnt
for(int i = 1; i <= 9; i++) {
sum += cnt * isbn_int[i]; // 累计乘积
cnt ++;
}
就没问题了喵~
by ChuziChen2024 @ 2024-09-23 19:41:29
谢谢 :Q