请各位高手解决一个问题C++例子,请详细写下过程。

masmsnake 2012-06-27 05:52:52
Problem Statement
     Let's say you have a binary string such as the following:
011100011
One way to encrypt this string is to add to each digit the sum of its adjacent digits. For example, the above string would become:
123210122
In particular, if P is the original string, and Q is the encrypted string, then Q[i] = P[i-1] + P[i] + P[i+1] for all digit positions i. Characters off the left and right edges of the string are treated as zeroes.
An encrypted string given to you in this format can be decoded as follows (using 123210122 as an example):
Assume P[0] = 0.
Because Q[0] = P[0] + P[1] = 0 + P[1] = 1, we know that P[1] = 1.
Because Q[1] = P[0] + P[1] + P[2] = 0 + 1 + P[2] = 2, we know that P[2] = 1.
Because Q[2] = P[1] + P[2] + P[3] = 1 + 1 + P[3] = 3, we know that P[3] = 1.
Repeating these steps gives us P[4] = 0, P[5] = 0 , P[6] = 0, P[7] = 1, and P[8] = 1.
We check our work by noting that Q[8] = P[7] + P[8] = 1 + 1 = 2. Since this equation works out, we are finished, and we have recovered one possible original string.
Now we repeat the process, assuming the opposite about P[0] :
Assume P[0] = 1.
Because Q[0] = P[0] + P[1] = 1 + P[1] = 0, we know that P[1] = 0.
Because Q[1] = P[0] + P[1] + P[2] = 1 + 0 + P[2] = 2, we know that P[2] = 1.
Now note that Q[2] = P[1] + P[2] + P[3] = 0 + 1 + P[3] = 3 , which leads us to the conclusion that P[3] = 2. However, this violates the fact that each character in the original string must be '0' or '1'. Therefore, there exists no such original string P where the first digit is '1'.
Note that this algorithm produces at most two decodings for any given encrypted string. There can never be more than one possible way to decode a string once the first binary digit is set.
Given a String message, containing the encrypted string, return a String[] with exactly two elements. The first element should contain the decrypted string assuming the first character is '0'; the second element should assume the first character is '1'. If one of the tests fails, return the string "NONE" in its place. For the above example, you should return {"011100011", "NONE"}.
Definition
     Class: BinaryCode
Method: decode
Parameters: String
Returns: String[]
Method signature: String[] decode(String message)
(be sure your method is public)

    

Constraints
- message will contain between 1 and 50 characters, inclusive.
- Each character in message will be either '0', '1', '2', or '3'.
Examples
0)
     "123210122"

Returns: { "011100011", "NONE" }
The example from above.


1)
     "11"

Returns: { "01", "10" }
We know that one of the digits must be '1', and the other must be '0'. We return both cases.


2)
     "22111"

Returns: { "NONE", "11001" }
Since the first digit of the encrypted string is '2', the first two digits of the original string must be '1'. Our test fails when we try to assume that P[0] = 0.


3)
     "123210120"

Returns: { "NONE", "NONE" }
This is the same as the first example, but the rightmost digit has been changed to something inconsistent with the rest of the original string. No solutions are possible.


4)
     "3"

Returns: { "NONE", "NONE" }


5)
     "12221112222221112221111111112221111"

Returns:
{ "01101001101101001101001001001101001",
"10110010110110010110010010010110010" }


This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.
注:求解该问题需要对string类有比较深入的理解及应用。
...全文
108 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
masmsnake 2012-06-28
  • 打赏
  • 举报
回复
用c语言怎么写啊,能讲下过程么,

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


void main()
{
//定义一个字符型字符串,表示输入的多少个数字,他表示加密后的数字
char shuzi[50];
//定义一个数字,表示原始的数字,原值要与加密数位置对应,要用到指针
int *yuanzhi;

//定义一个变量,表示从1-50循环次数
int i;
int n;

//输入50个数字,%c表示打印一个字符
scanf("%s",&shuzi);
//该函数表示获得字符串实际长度,赋值给n,之前我没有用strlen,直接写的50,出现了问题,如:输入5个字母12121,上下的45个就是未知数,重复输出45下不合法
//strlen与sizeof的区别在于,sizeof不是函数,只是操作符,返回的是声明后所占的内存长度,不是实际长度。
n=strlen(shuzi);
//因为要求,输入参数要包括1到50个字符,字符只能是0,1,2,3。对此进行判断

for(i=0;i<n;i++)
{
if(shuzi[i]<'0' || shuzi[i]>'3')
{
printf("输入的数字不合法");
}
}

/*
for(i=0;i<n;i++)
{
yuanzhi[i]=&shuzi[i];
}

*/

我怎么定义一个指针,指向数组里面,后面的判断,我知道怎么弄
}
hqw19881118 2012-06-27
  • 打赏
  • 举报
回复
这个实现起来应该不难,算法已经讲得很清楚啦!自已动手写写就OK了
masmsnake 2012-06-27
  • 打赏
  • 举报
回复
本人是新手,多谢大家讲解。

65,210

社区成员

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

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