0分求助!

P1055 [NOIP2008 普及组] ISBN 号码

Kyleshao @ 2023-06-26 16:06:07

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    cin>>s;
    long long mul=0;
    int cur=0;
    for (int i=0;i<s.size();i++)
    {
        if (!(s[i]=='-'))
        {
            int p=s[i]-'0';
            cur++;
            mul+=(p*cur);
        }
    }
    if (mul%11==(s[s.size()-1]-'0') && mul%11!=10)
    {
        cout<<"Right"<<endl;
    }
    else if (mul%11==10 && s[s.size()-1]=='X')
    {
        cout<<"Right"<<endl;
    }
    else
    {
        s[s.size()-1]=mul%11+'0';
        if (s[s.size()-1]==':')
        {
            s[s.size()-1]='X';
        }
        cout<<s<<endl;
    }
    return 0;
}

by sxjsxj @ 2023-06-26 17:25:04

不用算这个号码的长度,因为题目已经说出保证输入符合ISBN号码的格式要求了,所以s.size不需要。

循环开始就不太对了,第一个分支包括了最后一个数,我的思路是从开头开始算,算到倒数第二个数字,然后用这些乘积的和模11,如果与最后一个数字相同输出Right,不然就将最后一个数字改为模后的余数。所以循环只要到倒数第二个数字(位于第十一位)就行了。 代码:

#include<iostream>
#include<cstring>
using namespace std;
string s;
int i,c=1,all;
long long sum=0;
int main()
{
    getline(cin,s);
    for(i=0;i<=10;i++)
        if(s[i]!='-')
            sum+=(s[i]-48)*c++;
    all=sum%11;
    if(all==s[12]-48 || 
    (all%11==10 && s[12]=='X'))
        printf("Right");
    else 
    {
        for(i=0;i<=11;i++)
            printf("%c",s[i]);
        if(all!=10)
            printf("%d",all);
        else
            printf("X");
    }
}

|