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");
}
}