P1055 ISBN号码
题目描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括 99 位数字、 11 位识别码和 33 位分隔符,其规定格式如x-xxx-xxxxx-x
,其中符号-
就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4
就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如 00 代表英语;第一个分隔符-
之后的三位数字代表出版社,例如 670670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以 11 加上次位数字乘以 22 ……以此类推,用所得的结果 \bmod 11mod11 ,所得的余数即为识别码,如果余数为 1010 ,则识别码为大写字母 XX 。例如ISBN号码0-670-82162-4
中的识别码 44 是这样得到的:对067082162
这 99 个数字,从左至右,分别乘以 1,2,...,91,2,...,9 再求和,即 0×1+6×2+……+2×9=1580×1+6×2+……+2×9=158 ,然后取 158 \bmod 11158mod11 的结果 44 作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right
;如果错误,则输出你认为是正确的ISBN号码。
输入输出格式
输入格式:
一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式:
一行,假如输入的ISBN号码的识别码正确,那么输出Right
,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-
)。
输入输出样例
输入样例#1: 复制
0-670-82162-4
输出样例#1: 复制
Right
输入样例#2: 复制
0-670-82162-0
输出样例#2: 复制
0-670-82162-4
说明
2008普及组第一题
思路:如果写过pat检测身份证的话那这道就太简单了;
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[15]; 4 int main(){ 5 scanf("%s",s); 6 int t=1; 7 int sum=0; 8 for(int i=0;i<13;i++){ 9 if(i!=12){ 10 if(s[i]>=‘0‘&&s[i]<=‘9‘){ 11 sum=sum+(s[i]-‘0‘)*t; 12 t++; 13 } 14 else continue; 15 } 16 else{ 17 sum=sum%11; 18 int b; 19 if(s[i]==‘X‘){ 20 b=10; 21 } 22 else{ 23 b=s[i]-‘0‘; 24 } 25 if(sum==b){ 26 printf("Right\n"); 27 } 28 else{ 29 if(sum==10) s[i]=‘X‘; 30 else s[i]=sum+‘0‘; 31 for(int i=0;i<13;i++){ 32 printf("%c",s[i]); 33 } 34 printf("\n"); 35 } 36 break; 37 } 38 } 39 }
P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
题目描述
众所周知,在每一个彗星后都有一只UFO。这些UFO时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走。他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?)。关于如何搭配的细节会在下面告诉你;你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带走。
小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中 AA 是 11 , ZZ 是 2626 。例如, USACOUSACO 小组就是 21 \times 19 \times 1 \times 3 \times 15=1795521×19×1×3×15=17955 。如果小组的数字 \bmod 47mod47 等于彗星的数字 \bmod 47mod47 ,你就得告诉这个小组需要准备好被带走!(记住“ a \bmod bamodb ”是 aa 除以 bb 的余数; 34 \bmod 1034mod10 等于 44 )
写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出“GO”,否则输出“STAY”。小组名和彗星名均是没有空格或标点的一串大写字母(不超过 66 个字母)。
输入输出格式
输入格式:
第1行:一个长度为 11 到 66 的大写字母串,表示彗星的名字。
第2行:一个长度为 11 到 66 的大写字母串,表示队伍的名字。
输出格式:
输入输出样例
输入样例#1: 复制
COMETQ HVNGAT
输出样例#1: 复制
GO
输入样例#2: 复制
ABSTAR USACO
输出样例#2: 复制
STAY
说明
题目翻译来自NOCOW。
USACO Training Section 1.1
思路:暴力;
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[10],s1[10]; 4 int main(){ 5 scanf("%s",s); 6 scanf("%s",s1); 7 int t=strlen(s),t1=strlen(s1); 8 int sum=1; 9 for(int i=0;i<t;i++){ 10 sum=(sum*(s[i]-‘A‘+1))%47; 11 } 12 sum%=47; 13 int sum1=1; 14 for(int i=0;i<t1;i++){ 15 sum1=(sum1*(s1[i]-‘A‘+1))%47; 16 } 17 sum1%=47; 18 if(sum==sum1){ 19 printf("GO\n"); 20 } 21 else{ 22 printf("STAY\n"); 23 } 24 }
P1308 统计单词数
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入输出格式
输入格式:
共 22 行。
第 11 行为一个字符串,其中只含字母,表示给定单词;
第 22 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 00 开始);如果单词在文章中没有出现,则直接输出一个整数 -1?1 。
输入输出样例
输入样例#1: 复制
To to be or not to be is a question
输出样例#1: 复制
2 0
输入样例#2: 复制
to Did the Ottoman Empire lose its power at that time
输出样例#2: 复制
-1
说明
数据范围
1≤1≤ 单词长度 ≤10≤10 。
1≤1≤ 文章长度 ≤1,000,000≤1,000,000 。
noip2011普及组第2题
思路:暴力找,但是这道题很奇怪,我认为下面的代码其实是错的,应为连样例都过不了,但是却AC了
1 #include <iostream> 2 #include <string.h> 3 #include <stdlib.h> 4 using namespace std; 5 int main(){ 6 string a; 7 string b; 8 getline(cin,a,‘\n‘); 9 getline(cin,b,‘\n‘); 10 for(int i=0;i<b.length();i++){ 11 if(b[i]>=‘a‘ && b[i]<=‘z‘) 12 b[i]=b[i]-32; 13 } 14 for(int i=0;i<a.length();i++){ 15 if(a[i]>=‘a‘ && a[i]<=‘z‘) 16 a[i]=a[i]-32; 17 } 18 int j; 19 int sum=0; 20 int k=0; 21 for(int i=0;i<b.length();i++){ 22 if(a[0]==b[i]){ 23 for(j=0;j<a.length();j++){ 24 if(a[j]!=b[i+j]) 25 break; 26 } 27 if(j==a.length() && b[i+j]==‘ ‘ && b[i-1]==‘ ‘){ 28 sum++; 29 if(sum==1){ 30 k=i; 31 } 32 } 33 } 34 } 35 if(k!=0){ 36 cout<<sum<<" "<<k; 37 } 38 else{ 39 cout<<-1; 40 } 41 return 0; 42 }
这个代码我觉得是过的,结果它没过,我觉得应该是题目有点问题
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[15],s1[1000005]; 4 int main(){ 5 scanf("%s\n",s); 6 gets(s1+1); 7 s1[0]=‘ ‘;s1[strlen(s1)]=‘ ‘;s1[strlen(s1)+1]=‘\0‘; 8 for(int i=0;i<strlen(s);i++){ 9 if(s[i]>=‘A‘&&s[i]<=‘Z‘){ 10 s[i]=s[i]-‘A‘+‘a‘; 11 } 12 } 13 for(int i=0;i<strlen(s1);i++){ 14 if(s1[i]>=‘A‘&&s1[i]<=‘Z‘){ 15 s1[i]=s1[i]-‘A‘+‘a‘; 16 } 17 } 18 int sum=0,xiabiao; 19 for(int i=0;i<strlen(s1);i++){ 20 if(s1[i]==s[0]){ 21 int f=1; 22 for(int j=0;j<strlen(s);j++){ 23 if(s1[i+j]!=s[j]){ 24 f=0; 25 break; 26 } 27 } 28 if(f&&s1[i+strlen(s)]==‘ ‘&&s1[i-1]==‘ ‘){ 29 sum++; 30 if(sum==1){ 31 xiabiao=i; 32 } 33 } 34 } 35 } 36 if(sum==0) 37 printf("-1\n"); 38 else 39 printf("%d %d\n",sum,xiabiao-1); 40 }
应为在这道题上存在疑问,我也就没有去写下面的题目;
原文地址:https://www.cnblogs.com/dahaihaohan/p/9307317.html