总结一下本周做题出错的地方
一.
P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
题目描述
众所周知,在每一个彗星后都有一只UFO。这些UFO时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走。他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?)。关于如何搭配的细节会在下面告诉你;你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带走。
小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中A是1,Z是26。例如,USACO小组就是21×19×1×3×15=17955。如果小组的数字mod47等于彗星的数字mod47,你就得告诉这个小组需要准备好被带走!(记住“amodb”是a除以b的余数;34mod10等于4)
写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出“GO”,否则输出“STAY”。小组名和彗星名均是没有空格或标点的一串大写字母(不超过6个字母)。
输入格式
第1行:一个长度为1到6的大写字母串,表示彗星的名字。
第2行:一个长度为1到6的大写字母串,表示队伍的名字。
输出格式
无
#include <stdio.h>
#include<string.h>
int main(){
char a[10],b[10];
int ji1=1,ji2=1;
int z=0;
gets(a);
gets(b);
if(strlen(a)==0||strlen(b)==0){
printf("STAY");
return 0;
}
for(int i=0;i<strlen(a);i++){
z= a[i]-'A'+1;
ji1 *=z;
}
for(int i=0;i<strlen(b);i++){
z= b[i]-'A'+1;
ji2 *= z;
}
if(ji1%47==ji2%47)
printf("GO");
else printf("STAY");
return 0;
}
在把字母转换为数字时,要记得-'A'后+1,否则数字会小1.
二,
P1321 单词覆盖还原
题目描述
一个长度为 l(3≤l≤255) 的字符串中被反复贴有 boy
和 girl
两单词,后贴上的可能覆盖已贴上的单词(没有被覆盖的用句点表示),最终每个单词至少有一个字符没有被覆盖。问贴有几个 boy 几个 girl?
输入格式
一行被被反复贴有boy和girl两单词的字符串。
输出格式
两行,两个整数。第一行为boy的个数,第二行为girl的个数。
#include<stdio.h>
#include<string.h>
int main()
{
int boy,girl;
char a[260];
gets(a);
int i;
for (i=0;a[i]!='\0';i++)
{
if (a[i]=='b'||a[i+1]=='o'||a[i+2]=='y')//第一个为o或y均不行
{
boy++;
}
if (a[i]=='g'||a[i+1]=='i'||a[i+2]=='r'||a[i+3]=='l')
{
girl++;
}
}
printf("%d\n%d",boy,girl);
return 0;
}
初看题目时一头雾水,看了好几遍才大概明白题目意思,代码中对单词的判断巧妙在于不会重复计算贴有的单词数,当a[i]为o或y时boy的数量均不会增加,因此不会重复计算数目.
三.
P1055 [NOIP2008 普及组] ISBN 号码
题目描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如x-xxx-xxxxx-x
,其中符号-
就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4
就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符-
之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4
中的识别码4是这样得到的:对067082162
这9个数字,从左至右,分别乘以1,2,...,9再求和,即0×1+6×2+……+2×9=158,然后取158mod11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right
;如果错误,则输出你认为是正确的ISBN号码。
输入格式
一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式
一行,假如输入的ISBN号码的识别码正确,那么输出Right
,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-
)。
#include <stdio.h>
int main()
{
char a[14];
int b[10];
int i,j=0;
int sum=0,s=0;
for(i=0;i<13;i++)
{
scanf("%c",&a[i]);
}
for(i=0;i<12;i++)
{
if(a[i]>='0'&&a[i]<='9')
{
b[j++]=a[i]-48;
}
}
for(i=0;i<9;i++)
{
sum+=(i+1)*b[i];
}
s=sum%11;
if(s!=10)
{
if(s==a[12]-48)
{
printf("Right");
}
else
{
for(i=0;i<12;i++)
printf("%c",a[i]);
printf("%d",s);
}
}
else
{
if(a[12]=='X')
printf("Right");
else
{
for(i=0;i<12;i++)
printf("%c",a[i]);
printf("X");
}
}
return 0;
}
这道题比较粗心的地方是一开始忘了a[i]后要-48才能进行正确的转换,该处与第一题有相似之处,可以放在一起总结,便于以后注意此类错误.
以上就是对本周部分题目的总结,希望以后减少类似的错误.