不知道哪里错了,求助

P1055 [NOIP2008 普及组] ISBN 号码

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


|