递归运算,计算无法处理,老是未响应,找人帮忙。
程序我已经写好了,是用DELPHI写的,要生成1296个含0,1的2进制数据,规律头尾相接任意取11位都跟另外的不重复,而且要求是1296个数据里,0和1的个数相等,我现在的电脑无法运算这么大,希望有人能够帮忙运算,如果能够提供更好的方法生成也可以,我采用的是递归操作。我的QQ:106873730,邮箱:ajq_8036@163.com.有服务器或者能够支持大运算的,请联系我,或者有更好算法的也可以。分不够可以再加。 --------------------编程问答-------------------- 请举例说明是什么样的数,或者给出你的程序片断。 --------------------编程问答-------------------- C# 帮顶!! --------------------编程问答-------------------- 我的理解:
一个二进制值,假设为11010001010101000111,头尾衔接成环后,1和0的个数相同,并且任取11位,都不会这个环里找到第2个同样的片段。
对吗? --------------------编程问答-------------------- 帮你顶顶 --------------------编程问答-------------------- 我现在的思路是这样的:
先把int转换成对应的二进制形式的string,再把string的char[]作成一个环形队列,这样就可以在其中取片段进行筛选了。 --------------------编程问答-------------------- 程序我已经写好了,可是我需要的编码比较长,运算量太大,导致我的计算机运算都卡死了。Delphi的代码如下:
function TFrmMain.CharCount(s,c:string):Integer;
begin
Result := (Length(s) - Length(AnsiReplaceStr(s,c,''))) div (length(c));
end;
function TFrmMain.TestCode_IsPH(Test_Code:String):Boolean;
begin
if CharCount(Test_Code,'0') = CharCount(Test_Code,'1') then
Result := True
else
Result := False;
end;
function TFrmMain.TestByNum(TestCode,SourceCode:String;WS:Integer):Boolean;
var
Loop:Integer;
Flag :Boolean;
begin
Flag := True;
for Loop := 1 to length(SourceCode) - WS + 1 do
begin
if Copy(SourceCode,Loop,ws) = TestCode then
begin
Flag := False;
Break;
end;
end;
Result := Flag;
end;
//JZ--进制
//WS--位数
//TotalNum--个数
function TFrmMain.GetCodeByNum(MiddleCode:String;JZ,WS,TotalNum:Integer;TmpList:TMemo):String;
var
FirstCode:String;
CurrentCode:String;
Loop:Integer;
OverCode:String;
begin
self.StatusBar1.Panels[0].Text := IntToStr(StrToInt(self.StatusBar1.Panels[0].Text) + 1);
FirstCode := Copy(MiddleCode,1,Ws);
CurrentCode := Copy(MiddleCode,length(MiddleCode) - Ws + 2,Ws - 1);
if length(MiddleCode) = TotalNum + Ws - 1 then
begin
if (CurrentCode + Copy(MiddleCode,1,1) = FirstCode) then
begin
OverCode := copy(MiddleCode,1,length(MiddleCode) - WS + 1);
if TestCode_IsPH(OverCode) then
begin
GoalFlag := 1;
ListBox1.Items.Add(OverCode);
end;
end;
Exit;
end;
for Loop := 0 to Jz - 1 do
begin
if TestByNum(CurrentCode + IntToStr(Loop),MiddleCode,WS) then
begin
if GoalFlag <> 1 then
GetCodeByNum(MiddleCode + IntToStr(Loop),Jz,Ws,TotalNum,TmpList);
end;
end;
end; --------------------编程问答--------------------
Abbey
(老毕)
等 级:
#3楼 得分:0回复于:2011-07-15 11:10:33我的理解:
一个二进制值,假设为11010001010101000111,头尾衔接成环后,1和0的个数相同,并且任取11位,都不会这个环里找到第2个同样的片段。
对吗?
你的理解是对的,不过我需要这个二进制的长度是1296,我的程序是用递归做的,程序执行后一会就在任务管理器里就显示未反映。
例如:
以下编码为2进制,任意连续取4位都是唯一的,长度为10位。
0000101111
分解为:
0000
0001
0010
0101
1011
0111
1111
1110
1100
1000
这个10个编码都是不重复的,而且0,1个数不相等。
我现在的程序需要自定义个数,而且0,1必须相等,所以运算量太大,导致计算机无法计算出来。
如果是不自定义个数,比如2的11次方是2046,这个编码我直接能够生成。
或者自定义个数1296,但是不要求0,1必须相等个数,编码也能出来。
--------------------编程问答-------------------- 好像是哈弗曼编码? --------------------编程问答-------------------- 可以叫做左移循环码,任取N位的话,那就是下一编码的前N-1位和前一编码的后N-1位一摸一样。 --------------------编程问答-------------------- DELPHI不懂,进来溜溜! --------------------编程问答--------------------
--------------------编程问答-------------------- 帮顶吧。
string binarystring="11010001010101000111";
//检查所给二进制串是否符合要求,由outOfZero及countOfOne带出该串中含0和1的个数
bool CheckBinaryString(string binaryString, out int countOfZero, out int countOfOne)
{
countOfZero = countOfOne = 0;
List<string> subStrings = new List<string>(); //用于存放所有出现过的子串
for (int i = 0; i < binaryString.Length; i++)
{
char ch = binaryString[i];
if (ch=='0') countOfZero++; // 0 的个数加一
else if (ch=='1') countOfOne++; // 1 的个数加一
else return false; //不合法的字符串
string subString = ""; //用于存放当前位置开始取11个字符的子串
int index = i;
for (int j = 0; j < 11; j++)
{
subString += binaryString[index];
index = (index + 1) % binaryString.Length;
}
if (subStrings.Contains(subString)) return false; //出现重复的子串
}
return true; //是合格的
}
我不会DELPHI --------------------编程问答-------------------- http://www.cnblogs.com/Abbey/archive/2011/07/16/2107898.html
这是我昨天想到的,因为时间有限,没有全部实现。
我的思路如下:
利用字符串的位移操作,再结合字符串查找来确定取出的片段是否独立段。就是每次从字符串首取N位,然后在剩下的串中查找有否重复。
如果有,则字符串移一位,再取一次N位的片段,再遍历一次查找重复项。如果没有,则表示这是独立段。 --------------------编程问答-------------------- 又看到了曾经熟悉的代码,只不过现在感觉有些陌生 --------------------编程问答-------------------- 有服务器的飘过,需要的话找我,没学过delphi,要的话直接给可执行文件。 --------------------编程问答-------------------- 不一定需要DELPHI运行,用别的语言写也可以,我只要能生成那组编码就OK --------------------编程问答-------------------- 回复11楼,是需要闭环的,生成的1296的个0,1形成一个圆环。 --------------------编程问答-------------------- 不知道是不是DELPHI对递归深度有限制,有C#的兄弟能把我的Delphi改写称C#来运行看看。
补充:.NET技术 , C#