10677 我们仍未知道那天所看见的花的名字
时间限制:1000MS 内存限制:65535K
题型: 编程题 语言: 无限制
Description
芽间、仁太、波波、安鸣、雪集、鹤见是昔日孩童时期总是一起结伴同玩的6位好朋友。自从小时候的一次意外后,大家的关系渐行渐远。
随着时间的流逝,大家都为了自己的生活和理想各奔东西。
某天,芽间要离开大家了,她给大家各留下了一封电子邮件。这时候,在名牌高中读书的雪集,仗着自己的电脑知识,
把给仁太电子邮件内容(一句话)加密了。
然后他留下了一段加密程序,因为他想看看读普通学校的仁太能不能解密出来的。
但事实证明,学校的名牌与否不是最重要的,重要的是自己个人的努力。为了看到芽间给自己的信,仁太专门去学了C语言,
然后把那句话解密出来了。你也能做到吗?
输入格式
以下是雪集的加密代码:
void Encrypt(char msg[])
{
char key[] = "sleepiforest";
int msgLen = strlen(msg);
int keyLen = strlen(key);
int offset;
for(offset=0;offset<msgLen;++offset)
{
msg[offset] ^= key[offset%keyLen]; // ^是异或运算
}
for(offset=0;offset<msgLen;++offset)
{
printf("%02x ",msg[offset]); //%x是十六进制
}
}
芽间的邮件里的内容msg传入上面的函数后,得到以下的输出。
53 30 39 59 0e 48 18 4f 34 0a 01 13 16 18 48 28 15 44 28 00 06 45 0d 55 0d 52 4a 4a 50你能把msg的原文输出解密出来吗?
输出格式
根据加密程序,把这句话解密,然后输出出来即可。
例如:假设解密出来的这句话是“WELCOME TO THE TEAM OF SCAU_ACM”。
那么你只需要把这句话输出就可以了。
提供一个模板:
#include <stdio.h>
int main()
{
char msg[] = "WELCOME TO THE TEAM OF SCAU_ACM";
puts(msg);
return 0;
}
PS:题目的背景是一部略带伤感的日本动画片,有兴趣可以搜来看一下。
时间限制:1000MS 内存限制:65535K
题型: 编程题 语言: 无限制
Description
芽间、仁太、波波、安鸣、雪集、鹤见是昔日孩童时期总是一起结伴同玩的6位好朋友。自从小时候的一次意外后,大家的关系渐行渐远。
随着时间的流逝,大家都为了自己的生活和理想各奔东西。
某天,芽间要离开大家了,她给大家各留下了一封电子邮件。这时候,在名牌高中读书的雪集,仗着自己的电脑知识,
把给仁太电子邮件内容(一句话)加密了。
然后他留下了一段加密程序,因为他想看看读普通学校的仁太能不能解密出来的。
但事实证明,学校的名牌与否不是最重要的,重要的是自己个人的努力。为了看到芽间给自己的信,仁太专门去学了C语言,
然后把那句话解密出来了。你也能做到吗?
输入格式
以下是雪集的加密代码:
void Encrypt(char msg[])
{
char key[] = "sleepiforest";
int msgLen = strlen(msg);
int keyLen = strlen(key);
int offset;
for(offset=0;offset<msgLen;++offset)
{
msg[offset] ^= key[offset%keyLen]; // ^是异或运算
}
for(offset=0;offset<msgLen;++offset)
{
printf("%02x ",msg[offset]); //%x是十六进制
}
}
芽间的邮件里的内容msg传入上面的函数后,得到以下的输出。
53 30 39 59 0e 48 18 4f 34 0a 01 13 16 18 48 28 15 44 28 00 06 45 0d 55 0d 52 4a 4a 50你能把msg的原文输出解密出来吗?
输出格式
根据加密程序,把这句话解密,然后输出出来即可。
例如:假设解密出来的这句话是“WELCOME TO THE TEAM OF SCAU_ACM”。
那么你只需要把这句话输出就可以了。
提供一个模板:
#include <stdio.h>
int main()
{
char msg[] = "WELCOME TO THE TEAM OF SCAU_ACM";
puts(msg);
return 0;
}
只需要把msg里的内容换成你解密出来的内容,提交即可通过。
解题思路:
根据加密算法,得出的密文是十六进制,可先将密文转成十进制,再跟密钥进行一次异或运算,即可得出加密前的字符串。
以下为AC代码:
#include<stdio.h>
#include<string.h>
int main()
{
char bin[] = "53 30 39 59 0e 48 18 4f 34 0a 01 13 16 18 48 28 15 44 28 00 06 45 0d 55 0d 52 4a 4a 50";
char msg[50]={'\0'};
char key[] = "sleepiforest";
int k=0,i,keyLen = strlen(key);
for(i=0;i<strlen(bin);i+=3)
{
int tmp=(bin[i]-'0')*16;
if(bin[i+1]<='9')
tmp+=(bin[i+1]-'0');
else
tmp+=(bin[i+1]-87);
msg[k++]=char(tmp);
}
for(i=0;i<k;++i)
{
msg[i]^=key[i%keyLen];
}
puts(msg);
return 0;
}
PS:题目的背景是一部略带伤感的日本动画片,有兴趣可以搜来看一下。