思路:异或运算的运用,破译密码时一定存在一个大写字母使得所有的原文在'A'~'Z'之内。
异或运算法则:
1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
4. a ^ b ^ a = b. 相关链接(http://acm.hdu.edu.cn/showproblem.php?pid=1287)
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int maxn = 1001;
int a[maxn];
int main()
{
int n;
while(~scanf("%d", &n))
{
int i, j;
int tmp;
for(i = 0 ; i < n; ++i) scanf("%d", &a[i]);
for(i = 0+'A'; i <= 0+'Z'; i++)
{
for(j = 0; j < n; j++)
{
char c = a[j]^i;
if(c < 'A' || c > 'Z')
{
break;
}
}
if(j == n)
{
tmp = i;
break;
}
}
for(i = 0 ; i < n; i++)
{
printf("%c", a[i]^tmp);
}
printf("\n");
}
return 0;
#include <stdlib.h>
#include <string.h>
using namespace std;
const int maxn = 1001;
int a[maxn];
int main()
{
int n;
while(~scanf("%d", &n))
{
int i, j;
int tmp;
for(i = 0 ; i < n; ++i) scanf("%d", &a[i]);
for(i = 0+'A'; i <= 0+'Z'; i++)
{
for(j = 0; j < n; j++)
{
char c = a[j]^i;
if(c < 'A' || c > 'Z')
{
break;
}
}
if(j == n)
{
tmp = i;
break;
}
}
for(i = 0 ; i < n; i++)
{
printf("%c", a[i]^tmp);
}
printf("\n");
}
return 0;
}