90分求助(代码有点麻烦)

P1055 [NOIP2008 普及组] ISBN 号码

zhkkk_ @ 2024-09-03 20:46:29

#include <bits/stdc++.h>
using namespace std;
int a,b,c;
char x,y,z,d;
int main()
{
    cin>>a>>x>>b>>y>>c>>z>>d;
    if((a*1+b/100*2+b%100/10*3+b%10*4+c/10000*5+c%10000/1000*6+c%1000/100*7+c%100/10*8+c%10*9)%11==d)
        cout<<"Right";
    else if((a*1+b/100*2+b%100/10*3+b%10*4+c/10000*5+c%10000/1000*6+c%1000/100*7+c%100/10*8+c%10*9)%11==10)
    {
        if(d=='X') cout<<"Right";
        else cout<<a<<"-"<<b<<"-"<<c<<"-"<<'X';
    }    
    else cout<<a<<"-"<<b<<"-"<<c<<"-"<<(a*1+b/100*2+b%100/10*3+b%10*4+c/10000*5+c%10000/1000*6+c%1000/100*7+c%100/10*8+c%10*9)%11;
    return 0;
}

by SuperAlex4 @ 2024-09-03 20:56:50

其实你可以用中间变量的

(a*1+b/100*2+b/10%10*3+b%10*4+c/10000*5+c/1000%10*6+c/100%10*7+c/10%10*8+c%10*9)%11==(d&15)

数据里貌似没有前导 0 的情况。你想要可以自己加


by zhkkk_ @ 2024-09-03 21:00:46

@SuperAlex4 为什么#1过不了呢


by SuperAlex4 @ 2024-09-03 21:09:49

@xx31_qwq d 是个 char,ASCII 是数字的值按位或 48

你这么判只有 d \le 9 且需要输出 Right 的时候才会错。按常识来说 CCF 的数据应该不会让你输出一个 Right 就能骗很多分


by zhkkk_ @ 2024-09-03 21:20:37

@SuperAlex4 好的谢谢


by llhhss @ 2024-09-04 20:14:44

@xx31_qwq

#include <iostream>
#include <cstring>//头文件不解释
using namespace std;
int main()
{
    char s[14],c;
    cin>>s;
    int h=0,k=0;
    for(int i=0;i<11;i++)
    {
        if(s[i]!='-')
        {
            k++;
            h+=k*(s[i]-'0');//-0是为了将字符串变成普通数字
        }
    }
    h%=11;
    if(h==10) c='X';
    else c=h+'0';
    if(c==s[12]) cout<<"Right"<<endl;
    else
    {
        s[12]=c;
        cout<<s;
    }
    return 0;
}

|