华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2915|回复: 9
打印 上一主题 下一主题

P1055 ISBN号码

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-4-14 20:34:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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号码。
【思路】按题目要求模拟就行了,但是注意我是如何将不连续的东西变成连续的以便循环。

  1. #include<iostream>
  2. using namespace std;
  3. string s,t;
  4. int i,sum;
  5. int h[9]={0,2,3,4,6,7,8,9,10}; ///这个hash表可以将不连续的映射成连续
  6. int main()
  7. {
  8.     cin>>s;
  9.     for (i=0;i<=8;i++)
  10.         sum+=(s[h[i]]-'0')*(i+1);
  11.     sum%=11;t=s;
  12.     if (sum==10) t[t.size()-1]='X';else t[t.size()-1]=sum+'0';
  13.     if (t==s) cout<<"Right";else cout<<t;
  14.     return 0;
  15. }
复制代码

回复

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
沙发
发表于 2018-6-29 10:47:29 | 只看该作者
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. char st[100];
  5. int tzb[]={0,2,3,4,6,7,8,9,10};
  6. int i,a=0,b=-1;
  7. int main()
  8. {
  9.     scanf("%s",st);
  10.     for(i=0;i<9;i++)
  11.         a=a+(st[tzb[i]]-'0')*(i+1);
  12.     a=a%11;
  13.     if(st[12]=='X')b=10;
  14.     if((a==(st[12]-'0'))||(a==b))cout<<"Right"<<endl;
  15.     else
  16.     {
  17.         if(a!=10)st[12]='0'+a;else st[12]='X';
  18.         for(i=0;i<=12;i++)cout<<st[i];
  19.         cout<<endl;
  20.     }
  21.     return 0;
  22. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
板凳
 楼主| 发表于 2018-7-25 20:54:30 | 只看该作者
最笨的做法,很是直观,虽然写起来很有点累。
  1. #include <iostream>
  2. using namespace std;
  3. string s,t;
  4. int m,n,i;
  5. int main()
  6. {
  7.     cin>>s;
  8.     t=s;
  9.     m=(s[0]-'0')*1;  ///分段求和
  10.     m=m+(s[2]-'0')*2+(s[3]-'0')*3+(s[4]-'0')*4;
  11.     m=m+(s[6]-'0')*5+(s[7]-'0')*6+(s[8]-'0')*7+(s[9]-'0')*8+(s[10]-'0')*9;
  12.     m=m%11;
  13.     if (m==10) t[12]='X'; ///特殊判断
  14.     else t[12]=m+'0';

  15.     if (s==t) cout<<"Right";
  16.     else cout<<t;
  17.     return 0;
  18. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
地板
发表于 2018-7-29 23:54:45 | 只看该作者
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <algorithm>
  7. using namespace std;

  8. int main(){
  9.         int i,All=0,j;
  10.     char a[12];
  11.     gets(a);
  12.     for(i=0,j=1;i<=10;i++,j++)
  13.     {
  14.             if(i==1||i==5)
  15.             i++;
  16.             All=(a[i]-48)*j+All;
  17.         }
  18.         All=All%11;
  19.         if(All==10)
  20.         {
  21.                 if(a[12]=='X')
  22.                 printf("Right");
  23.                 else
  24.             {
  25.                     for(i=0;i<=11;i++)
  26.                     printf("%c",a[i]);
  27.                     printf("X");
  28.         }
  29.         }
  30.         else
  31.         {
  32.                 if(a[12]-48==All)
  33.             printf("Right");
  34.             else
  35.             {
  36.                     for(i=0;i<=11;i++)
  37.                     printf("%c",a[i]);
  38.                     printf("%d",All);
  39.         }
  40.         }
  41.     return 0;
  42. }
复制代码
回复 支持 反对

使用道具 举报

0

主题

30

帖子

91

积分

注册会员

Rank: 2

积分
91
5#
发表于 2018-8-1 19:58:03 | 只看该作者
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;

  4. char a[14],b[14],t1,t2;
  5. int t22=0;

  6. int main()
  7. {
  8.     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);
  9.     for(int i=1;i<=9;++i)
  10.         t22+=(a[i]-'0')*i;
  11.     t2=t22%11+'0';
  12.     if(t2=='0'+10)t2='X';
  13.     if(t1==t2)
  14.     {
  15.         cout<<"Right";
  16.         return 0;
  17.     }
  18.     else
  19.     {
  20.         cout<<a[1]<<'-'<<a[2]<<a[3]<<a[4]<<'-'<<a[5]<<a[6]<<a[7]<<a[8]<<a[9]<<'-'<<t2;
  21.         return 0;
  22.     }
  23. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
6#
发表于 2018-8-1 20:50:17 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int x,s,n;
  4. string isbn;
  5. int main()
  6. {
  7.     cin>>isbn;
  8.     for(int i=0; i<=11; i++)
  9.         if(isbn[i]>='0'&&isbn[i]<='9')
  10.         {
  11.             x=isbn[i]-'0';
  12.             s=s+x*(++n);
  13.         }
  14.     if(isbn[12]-'0'-30==s%11)cout<<"Right";
  15.     else if(s%11==isbn[12]-'0')cout<<"Right";
  16.     else
  17.     {
  18.         for(int i=0; i<=11; i++)cout<<isbn[i];
  19.         if(s%11==10)cout<<"X";
  20.         else cout<<s%11;
  21.     }
  22.     return 0;
  23. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
7#
 楼主| 发表于 2018-8-1 20:52:25 | 只看该作者
walkalone 同学读数据的那个方法好牛逼!!!
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
8#
 楼主| 发表于 2018-8-1 20:53:13 | 只看该作者
各位同学,这么简单的一个题目,你看看我的代码,有什么感觉,是不是清爽很多?
要学习!
回复 支持 反对

使用道具 举报

3

主题

50

帖子

365

积分

中级会员

Rank: 3Rank: 3

积分
365
9#
发表于 2018-8-10 16:31:10 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. string s,t;
  4. int i,total;
  5. int h[9]= {0,2,3,4,6,7,8,9,10};
  6. int main()
  7. {
  8.     cin>>s;
  9.     for (i=0; i<=8; i++)
  10.         total=total+(s[h[i]]-'0')*(i+1);
  11.     total=total%11;
  12.     t=s;
  13.     if (total==10) t[t.size()-1]='X';
  14.     else t[t.size()-1]=total+'0';
  15.     if (t==s) cout<<"Right";
  16.     else cout<<t;
  17.     return 0;
  18. }

  19. ///标准做法
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
10#
 楼主| 发表于 2020-2-21 20:40:27 | 只看该作者
基本做法: 根据前面的数字,我自己按规定算出一个 ISBN编码,把我这个编码和原来的比较,若相同,输出Rights
,否则输出我的;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 13:29 , Processed in 0.118303 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表