洛谷 P1055 ISBN号码 题解
P1055 ISBN号码
Main Idea:
按照题目提示判断输入的ISBN号码中识别码是否正确。
Summary:
1.同一条判断语句中,已执行的部分若有自增自减,则下一次自增自减是在前面已经自增自减的基础上进行的
Problem Solving Idea:
模拟题意。
AC代码(version 1):
#include<bits/stdc++.h>
using namespace std;
char a[15];
int main()
{
int mark1=0,mark2=0,mod=0,flag=1;
memset(a,'\0',sizeof(a));
scanf("%s",a);
for(int i=0;i<13;i++){
if(a[i]>=48&&a[i]<=57&&mark2<3){
mod+=(++mark1)*(a[i]-'0');
}
else if(a[i]=='-') mark2++;
if(mark2==3&&((mod%11==(a[++i]-'0'))||(mod%11==10&&a[12]=='X'))){//这里深坑。。。同一条判断语句中,已执行的部分若有自增自减,则下一次自增自减是在前面已经自增自减的基础上进行的
flag=1;
break;
}
if(mark2==3&&((mod%11!=(a[++i]-'0')&&mod%11!=10)||mod%11==10&&a[12]!='X')){
flag=0;
break;
}
}
if(flag) cout<<"Right";
else{
for(int i=0;i<12;i++) cout<<a[i];
if(mod%11==10) cout<<'X';
else cout<<mod%11;
}
return 0;
}
AC代码(version 2):
#include <bits/stdc++.h>
int main(){
char a[14], mod[12] = "0123456789X"; //先将mod11后的十一个字符存入数组
gets(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]) printf("Right");
else {
a[12] = mod[t%11];
puts(a);
}
return 0;
}