问题描述
问题分析
UVa的这些题目好难截图啊……
自己写的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| #include<stdio.h>
#include<string.h>
char Re[]="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
char s[30];
char ex(char c) {
if(c>='A'&&c<='Z')
return Re[c-'A'];
else
return Re[c-'1'+26];
}
int hui(char* s,int len) {
int i;
for(i=0; i<(len+1)/2; i++) {
if(s[i]!=s[len-i-1])
return 0;
}
return 1;
}
int jing(char* s,int len) {
int i;
for(i=0; i<(len+1)/2; i++) {
if(s[i]!=ex(s[len-i-1]))
return 0;
}
return 1;
}
int main() {
while(scanf("%s",s)!=EOF) {
if(hui(s,strlen(s))) {
if(jing(s,strlen(s)))
printf("%s -- is a mirrored palindrome.\n\n",s);
else
printf("%s -- is a regular palindrome.\n\n",s);
} else if(jing(s,strlen(s)))
printf("%s -- is a mirrored string.\n\n",s);
else
printf("%s -- is not a palindrome.\n\n",s);
}
return 0;
}
|
起初因为最后两个printf忘了写参数,结果总是莫名其妙的程序终止
还没收到警告
最后用在线编译检查出来的……
书中标准程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| #include<stdio.h>
#include<string.h>
#include<ctype.h>
const char* rev="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char* msg[]= {"not a palindrome","a regular palindrome","a mirrored string","a mirrored palindrome"};
char r(char ch) {
if(isalpha(ch))
return rev[ch-'A'];
return rev[ch-'0'+25];
}
int main() {
char s[30];
while(scanf("%s",s)==1) {
int len = strlen(s);
int p=1,m=1;
for(int i=0; i<(len+1)/2; i++) {
if(s[i]!=s[len-1-i])
p=0;
if(r(s[i])!=s[len-1-i])
m=0;
}
printf("%s -- is %s.\n\n",s,msg[m*2+p]);
//很有意思的输出方法 竟然通过m*2+p的式子神奇地判定了输出内容
}
return 0;
}
|
-.-话说起初因为打错一个单词一直WA 还以为代码有错呢……
与大神的差距就是那个 $m*2+p$ 因为没有使用这种巧妙的方法 为了好写 写了三个函数 有点繁琐了
不过思路还是很清晰的
几个if else 这点智商上的差距 不知道这辈子还能弥补上不……
题目地址:Palindromes - UVA 401 - Virtual Judge
PS:因为UVaOJ经常打不开……所以我看以后这些题尽量在UVa上传如果不行就找其他地址
这个是华中科技大学的Virtual Judge
使用最新的vjudge系统:Virtual Judge