【UVa】[401]Palindromes

文章字数:570

问题描述

问题分析

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

加载中...