第二周做题总结

总结一下本周做题出错的地方

一.

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才能进行正确的转换,该处与第一题有相似之处,可以放在一起总结,便于以后注意此类错误.

以上就是对本周部分题目的总结,希望以后减少类似的错误.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值