华师一附中OI组
标题:
P1055 ISBN号码
[打印本页]
作者:
admin
时间:
2018-4-14 20:34
标题:
P1055 ISBN号码
https://www.luogu.org/problemnew/show/P1055
例如0-670-82162-4就是一个标准的ISBN码,首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,...,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
【思路】按题目要求模拟就行了,但是注意我是如何将不连续的东西变成连续的以便循环。
#include<iostream>
using namespace std;
string s,t;
int i,sum;
int h[9]={0,2,3,4,6,7,8,9,10}; ///这个hash表可以将不连续的映射成连续
int main()
{
cin>>s;
for (i=0;i<=8;i++)
sum+=(s[h[i]]-'0')*(i+1);
sum%=11;t=s;
if (sum==10) t[t.size()-1]='X';else t[t.size()-1]=sum+'0';
if (t==s) cout<<"Right";else cout<<t;
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-6-29 10:47
#include<iostream>
#include<cstdio>
using namespace std;
char st[100];
int tzb[]={0,2,3,4,6,7,8,9,10};
int i,a=0,b=-1;
int main()
{
scanf("%s",st);
for(i=0;i<9;i++)
a=a+(st[tzb[i]]-'0')*(i+1);
a=a%11;
if(st[12]=='X')b=10;
if((a==(st[12]-'0'))||(a==b))cout<<"Right"<<endl;
else
{
if(a!=10)st[12]='0'+a;else st[12]='X';
for(i=0;i<=12;i++)cout<<st[i];
cout<<endl;
}
return 0;
}
复制代码
作者:
admin
时间:
2018-7-25 20:54
最笨的做法,很是直观,虽然写起来很有点累。
#include <iostream>
using namespace std;
string s,t;
int m,n,i;
int main()
{
cin>>s;
t=s;
m=(s[0]-'0')*1; ///分段求和
m=m+(s[2]-'0')*2+(s[3]-'0')*3+(s[4]-'0')*4;
m=m+(s[6]-'0')*5+(s[7]-'0')*6+(s[8]-'0')*7+(s[9]-'0')*8+(s[10]-'0')*9;
m=m%11;
if (m==10) t[12]='X'; ///特殊判断
else t[12]=m+'0';
if (s==t) cout<<"Right";
else cout<<t;
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-29 23:54
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int i,All=0,j;
char a[12];
gets(a);
for(i=0,j=1;i<=10;i++,j++)
{
if(i==1||i==5)
i++;
All=(a[i]-48)*j+All;
}
All=All%11;
if(All==10)
{
if(a[12]=='X')
printf("Right");
else
{
for(i=0;i<=11;i++)
printf("%c",a[i]);
printf("X");
}
}
else
{
if(a[12]-48==All)
printf("Right");
else
{
for(i=0;i<=11;i++)
printf("%c",a[i]);
printf("%d",All);
}
}
return 0;
}
复制代码
作者:
walk_alone
时间:
2018-8-1 19:58
#include<iostream>
#include<cstdio>
using namespace std;
char a[14],b[14],t1,t2;
int t22=0;
int main()
{
scanf("%c-%c%c%c-%c%c%c%c%c-%c",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&a[9],&t1);
for(int i=1;i<=9;++i)
t22+=(a[i]-'0')*i;
t2=t22%11+'0';
if(t2=='0'+10)t2='X';
if(t1==t2)
{
cout<<"Right";
return 0;
}
else
{
cout<<a[1]<<'-'<<a[2]<<a[3]<<a[4]<<'-'<<a[5]<<a[6]<<a[7]<<a[8]<<a[9]<<'-'<<t2;
return 0;
}
}
复制代码
作者:
黄煦喆
时间:
2018-8-1 20:50
#include<iostream>
using namespace std;
int x,s,n;
string isbn;
int main()
{
cin>>isbn;
for(int i=0; i<=11; i++)
if(isbn[i]>='0'&&isbn[i]<='9')
{
x=isbn[i]-'0';
s=s+x*(++n);
}
if(isbn[12]-'0'-30==s%11)cout<<"Right";
else if(s%11==isbn[12]-'0')cout<<"Right";
else
{
for(int i=0; i<=11; i++)cout<<isbn[i];
if(s%11==10)cout<<"X";
else cout<<s%11;
}
return 0;
}
复制代码
作者:
admin
时间:
2018-8-1 20:52
walkalone 同学读数据的那个方法好牛逼!!!
作者:
admin
时间:
2018-8-1 20:53
各位同学,这么简单的一个题目,你看看我的代码,有什么感觉,是不是清爽很多?
要学习!
作者:
WJL
时间:
2018-8-10 16:31
#include<iostream>
using namespace std;
string s,t;
int i,total;
int h[9]= {0,2,3,4,6,7,8,9,10};
int main()
{
cin>>s;
for (i=0; i<=8; i++)
total=total+(s[h[i]]-'0')*(i+1);
total=total%11;
t=s;
if (total==10) t[t.size()-1]='X';
else t[t.size()-1]=total+'0';
if (t==s) cout<<"Right";
else cout<<t;
return 0;
}
///标准做法
复制代码
作者:
admin
时间:
2020-2-21 20:40
基本做法: 根据前面的数字,我自己按规定算出一个 ISBN编码,把我这个编码和原来的比较,若相同,输出Rights
,否则输出我的;
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2