X公司在线评测题目一个

turing-complete 2011-09-08 02:00:07

/*
**以下程序是一个信息编码程序,阅读器encode部分,并补全decode部分
**最后运行程序,会打印出一句话,这句话就是我们要求的答案。
**注意:这句话是GBK编码的!
*/

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef unsigned int uint_32;
typedef unsigned char byte;

void encode(const void* raw_in, void* raw_out, uint_32 password, uint_32 len)
{
const byte* in = (const byte*)raw_in;
byte* out = (byte*)raw_out;
uint_32 seed = password ^ 0x9394d4e9u;
uint_32 i;
for (i = 0 ; i < len; ++i)
{
byte a = ( in[i] ^ seed ) >> 1;
byte b = ( ( ((uint_32)in[i]) << 13 ) ^ seed ) >> (13-7);
a &= 127;
b &= 128;
a = 127 & ( a ^ (b << 3));
out[i] = a | b;
seed = (((seed << 7) ^ seed ^ out[i]) + 48475829);
}
}


void decode(const void* raw_in, void* raw_out, uint_32 password, uint_32 len)
{
const byte* in = (const byte*)raw_in;
byte* out = (byte*)raw_out;
uint_32 seed = password ^ 0x9394d4e9u;
uint_32 i;
for (i = 0 ; i < len; ++i) {
// 请在此处补全代码

}
}

int main()
{
const byte buf1[] = {0x9c, 0xf9, 0x5b, 0x1f, 0xb9, 0x86, 0x4e, 0x39, 0xce, 0xec, 0x31, 0xbc, 0x31, 0xde, 0xc4, 0x3d, 0xfe, 0x56, 0xed, 0xdf, 0xc1, 0x4c, 0x07, 0xa8, 0x23, 0xdc, 0xdc, 0x97, 0x48, 0xc7, 0x5f, 0xeb, 0xb9, 0x1e };
byte buf2[100] = {0};
const uint_32 password = 0x8f98ce1bu;
const uint_32 len = sizeof(buf1);
decode(buf1, buf2, password, len);
printf("%s\n", buf2);
}


第一个正确答案得分
...全文
814 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
turing-complete 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 qixing1115 的回复:]

for (i = 0 ; i < len; ++i)
{
byte a = in[i]&127;
byte b = in[i]&128;
a = a<<1;
a = a^seed;
b = ((uint_32)in[i]<<(13-7)^seed)>>13;
a = a&254;
b = b&1;
o……
[/Quote]

群众要求分解
pathuang68 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 mervynhit 的回复:]

C/C++ code

void decode(const void* raw_in, void* raw_out, uint_32 password, uint_32 len)
{
const byte* in = (const byte*)raw_in;
byte* out = (byte*)raw_out;
uint_32 seed = password ^ 0……
[/Quote]
++
这个答案貌似正确的!手边木有编译器......
mervynhit 2011-09-09
  • 打赏
  • 举报
回复

void decode(const void* raw_in, void* raw_out, uint_32 password, uint_32 len)
{
const byte* in = (const byte*)raw_in;
byte* out = (byte*)raw_out;
uint_32 seed = password ^ 0x9394d4e9u;
uint_32 i;
for (i = 0 ; i < len; ++i) {
// calculate seed
//
byte A = in[i] & 127;
byte B = in[i] & 128;
A = A ^ (B << 3);
A = A & 127;
byte Resultbit0 = (( seed ^ ((uint_32)B << 6) ) >> 13) & 1 ;
byte Resultbit1_7 = ((A << 1) ^ seed) & 254;
out[i] = Resultbit0 | Resultbit1_7 ;
seed = (((seed << 7) ^ seed ^ in[i]) + 48475829);
}
}
Ilijah 2011-09-08
  • 打赏
  • 举报
回复
19楼的思路可以分享一下吗
起个昵称真难 2011-09-08
  • 打赏
  • 举报
回复
以上所有方法输出的都是乱码,求解释
起个昵称真难 2011-09-08
  • 打赏
  • 举报
回复
乱码啊乱码
mervynhit 2011-09-08
  • 打赏
  • 举报
回复
把里面的len - i - i改成len - i - 1
mervynhit 2011-09-08
  • 打赏
  • 举报
回复
我的方法,还没有调试,大概的思想就是这样


void decode(const void* raw_in, void* raw_out, uint_32 password, uint_32 len)
{
const byte* in = (const byte*)raw_in;
byte* out = (byte*)raw_out;
uint_32 seed = password ^ 0x9394d4e9u;
uint_32 i;
for (i = 0 ; i < len; ++i) {
// calculate seed
seed = seed + 48475829 * (len -i - i);
seed = seed ^ in[len - i - i];
seed = seed ^ (seed << 7);

//
byte A = ( in[len-i-1] ^ 0 ) & 127;
byte B = in[len-i-1] & 128;
byte Resultbit0 = (( seed ^ (B << 6) ) >> 13) & 1 ;
byte Resultbit1_7 = ((A << 1) ^ seed) & 254;
out[len-i-1] = Resultbit0 | Resultbit1_7 ;
}
}
xunxun 2011-09-08
  • 打赏
  • 举报
回复
额的神啊
ken_scott 2011-09-08
  • 打赏
  • 举报
回复
Mark
阿尔博特 2011-09-08
  • 打赏
  • 举报
回复
来学习 学习
qixing1115 2011-09-08
  • 打赏
  • 举报
回复
for (i = 0 ; i < len; ++i)
{
byte a = in[i]&127;
byte b = in[i]&128;
a = a<<1;
a = a^seed;
b = ((uint_32)in[i]<<(13-7)^seed)>>13;
a = a&254;
b = b&1;
out[i] = a|b;
seed = (((seed << 7) ^ seed ^ in[i]) + 48475829);
}



搜狗公司的前身是搜狐研发中心!!!
xu20101010 2011-09-08
  • 打赏
  • 举报
回复
跟去年软件竞赛的题好像
quwei197874 2011-09-08
  • 打赏
  • 举报
回复
人呀!
iblold 2011-09-08
  • 打赏
  • 举报
回复

void decode(const void* raw_in, void* raw_out, uint_32 password, uint_32 len)
{
const byte* in = (const byte*)raw_in;
byte* out = (byte*)raw_out;
uint_32 seed = password ^ 0x9394d4e9u;
uint_32 i;
for (i = 0 ; i < len; ++i) {

byte a = in[i] & 0x7f;
byte b = in[i] & 0x80;

b = (((b << 6) ^ seed) >> 13) & 0x1;

out[i] = (((a << 1) ^ seed) & 0xfe) | b;

seed = (((seed << 7) ^ seed ^ in[i]) + 48475829);
}
}
turing-complete 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qq295445028 的回复:]

正确的答案不会是乱码吧,纠结
[/Quote]

应该是不对吧
起个昵称真难 2011-09-08
  • 打赏
  • 举报
回复
正确的答案不会是乱码吧,纠结
起个昵称真难 2011-09-08
  • 打赏
  • 举报
回复
说实话,这个题我一看就头大,搞不清楚是怎么回事。为什么7楼的输出是乱码?
turing-complete 2011-09-08
  • 打赏
  • 举报
回复
像 7 楼那么做,是最好的,有代码有输出。
turing-complete 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qq295445028 的回复:]

引用 9 楼 mougaidong 的回复:
加一句,正确的答案指的是 代码 ,不是输出结果。


不是吧,“最后运行程序,会打印出一句话,这句话就是我们要求的答案”,这不是要输出?
[/Quote]

那是公司的要求,到这里当然是探讨知识和技术了
加载更多回复(10)

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧