题目:
Problem Description
全字母句 (pangram) 指包含字母表中全部 26 种英文字母(不区分大小写)的句子,其常被用于展示英文字体的显示效果。
现在,bLue 得到了很多句子,他想知道哪些句子是全字母句。
Input
输入数据有多组(数据组数不超过 100),到 EOF 结束。
每组数据包含一行长度不超过 100 的字符串。
Output
对于每组数据,输出一行。
如果是全字母句则输出 “Yes”,否则输出 “No”(不包括引号)。
Sample Input
The quick brown fox jumps over the lazy dog.
The 6th ACM Funny Programming For/While Contest
Sample Output
Yes
No
自己书写的代码提交之后是wrong answer,但没能够找到wrong answer的原因。后来在查看别人的代码过程中思考了自己代码存在的问题。首先自己的代码没有去用 牵扯到思想和算法的 这些应该可以称之为技巧的东西,基本上是根据题目要求通过简单的判断来实现,代码比较繁琐。同时,这样应对直观上输入输出的编码需要去考虑很多种情况以及很多细节,因此容易漏掉很多关键的信息。
在查看了别人的代码之后,我发现在解决问题的时候应该是正对问题的关键或者说是主题进行操作,而不是广而泛之的拼凑方便实现却没有思想的方法去解决,也就是说建模和思想很重要。不能懒,只是浮在表面去思考问题。
提交之后wrong answer的代码,没能找到wrong answer的原因,想了下,应该是判断的时候所想到的条件不够全面,而且自己有没想到的测试用例,所以也就没有找到那些没有想到的判断条件。
所以,我觉得在解决问题的时候,应该针对问题的对象,找问题的对象的特点,而不是拼凑判断方法来达到效果而已。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i;
char str[100];
while(gets(str))
{
if(strlen(str)3&&str[0]‘E’&&str[1]‘O’&&str[2]‘F’)
break;
for(i=0;i<strlen(str);i++)
{
if(!(str[i]>=‘a’&&str[i]<=‘z’||str[i]>=‘A’&&str[i]<=‘Z’||str[i]’.’||str[i]’ '))
break;
}
if(i<strlen(str))
printf(“No\n”);
else
printf(“Yes\n”);
}
return 0;
}
搜索查看他人的代码:
一开始其实并不理解这用了什么方法,慢慢地至少有一点理解代码了。
刚刚想写一下对代码的理解,所有又看了下代码,发现自己理解错了题意。
题意是包含字母表中全部26个字母(不分大小写),但是我的理解是不能包含字母之外的字符。
所以,在这个程序中使用了标记数组,将小写字母转换为大写字母,因为是字母不区分大小写,即同一个字母大小写算是26个中的一个。
通过标记数组查看哪个字母从未被用过。
就是不明白为什么要c[(char)i]==0,注释说把转化为char类型,如果用的是char类型的字符的ASCII码,i=65时字符为A,将i转化为字符型即为A,用到的是A的ASCII码,转换与不转换想不出哪儿不一样。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[1009];
int i,len1;
while(gets(a))
{
int c[150]={0};//初始化标记数组
len1=strlen(a);
for(i=0;i<=len1;i++)
{
if(a[i]>=‘a’&&a[i]<=‘z’)
{
a[i]=a[i]-32;
}
if(a[i]>=‘A’&&a[i]<=‘Z’)
{
c[a[i]]++;
}
}
int flag=0;
for(i=65;i<=90;i++)
{
if(c[(char)i]0)//把i转化为char类型
{
flag=1;
break;
}
}
if(flag0)
printf(“Yes\n”);
else
printf(“No\n”);
}
return 0;
}