[存档!]纯数学、物理学、化学等:与贸易没有任何关系的大脑训练问题 - 页 510 1...503504505506507508509510511512513514515516517...628 新评论 Maxim Zaguzov 2011.08.21 21:08 #5091 IgorM: 我不喜欢使用continue和break运算符,但也许它们可以帮助你,特别是在mql上的36倍if可能不工作。 如果它不起作用,我就会用继续...但我根本不想去管它。我宁愿创造一个不同的算法,至少会很有趣。 Vladimir Gomonov 2011.08.21 21:21 #5092 MaxZ: 并加速 我的代码可以分解if,由一个复杂的36个检查条件组成,变成36个有简单条件的if!:))) 我认为代码的速度会明显加快,尽管要确定你需要了解机器指令,这就是编译的结果。 我在MT5中运行了你的代码。 它已经实现了逻辑运算符的简短评估(内置),所以没有必要将代码分解成大量的ifs。 在MT4中则不同,这种优化在那里是有意义的。但我在MT5中做了时间评估,通过简短的计划。 Vladimir Gomonov 2011.08.21 21:47 #5093 加速了4倍。 重写了Validate()。 现在是这样的。 bool Validate(int X) { int XX=0; int A[]; IntToArray(X,A); for(int i=5;i>-1;i--) { XX|=int(1<<A[i]); } if(XX==0x7E) {return true;} return false; } void IntToArray(int X, int &A[]) { ArrayResize(A,6); for(int i=0;i<6;i++) { A[i]=X%10; X/=10; } } 工作时间 == 200 ms Maxim Zaguzov 2011.08.21 21:53 #5094 可怕的是,但用以下方式优化代码是有意义的。快了许多倍!而在这里,MT5不会再有任何帮助。 当然,这不是一个想法。但我想知道它的工作速度会有多快!:)) 另外,在代码中,我减少了除数值的范围。654321/2 = 327160,5... for (int A6 = 1; A6 <= 6; A6++) for (int A5 = 1; A5 <= 6; A5++) { if (A5 == A6) continue; for (int A4 = 1; A4 <= 6; A4++) { if (A4 == A5 || A4 == A6) continue; for (int A3 = 1; A3 <= 6; A3++) { if (A3 == A4 || A3 == A5 || A3 == A6) continue; for (int A2 = 1; A2 <= 6; A2++) { if (A2 == A3 || A2 == A4 || A2 == A5 || A2 == A6) continue; for (int A1 = 1; A1 <= 6; A1++) { if (A1 == A2 || A1 == A3 || A1 == A4 || A1 == A5 || A1 == A6) continue; for (int B6 = 1; B6 <= 3; B6++) { if (B6 == A6) continue; for (int B5 = 1; B5 <= 6; B5++) { if (B6 == 3 && B5 > 2) continue; if (B5 == A5) continue; if (B5 == B6) continue; for (int B4 = 1; B4 <= 6; B4++) { if (B4 == A4) continue; if (B4 == B5 || B4 == B6) continue; for (int B3 = 1; B3 <= 6; B3++) { if (B3 == A3) continue; if (B3 == B4 || B3 == B5 || B3 == B6) continue; for (int B2 = 1; B2 <= 6; B2++) { if (B2 == A2) continue; if (B2 == B3 || B2 == B4 || B2 == B5 || B2 == B6) continue; for (int B1 = 1; B1 <= 6; B1++) { if (B1 == A1) continue; if (B1 == B2 || B1 == B3 || B1 == B4 || B1 == B5 || B1 == B6) continue; int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1; int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1; if (MathMod(A, B) == 0) Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B); } } } } } } } } } } } Maxim Zaguzov 2011.08.21 21:58 #5095 MetaDriver: 加速了4倍。 重写了Validate()。 现在看起来是这样的。 工作时间 == 200 ms 太漂亮了!不像我的。 我有一个想法,要写一个列除法算法。除以数字,写下除法的余数,当结果大于6时,做继续运算。这正是我今天下午所做的,当我翻阅这五份文件时,我把所有东西都分成了几栏。但这是一个漫长的过程!:)) 在十六进制的数字表示中,你需要进行优化,正如你所做的那样。 Vladimir Gomonov 2011.08.21 22:20 #5096 MaxZ: 我有一个想法,要写一个列除法算法。除以数字,写下除法的余数,如果符合或结果大于6,就做继续操作。这 正是我今天下午所做的,当我翻阅这五份文件时,我把所有东西都分成了几栏。但这是一个漫长的过程!:)) 我们需要优化的是六位数的表述,正如你所做的那样。 О!这并不是一个坏主意。又重写了一遍。 工作时间=125毫秒。 bool Validate(int X) { int XX=0; int A[]; if(!IntToArray(X,A)) return false; // изменено здесь тоже, но основное ниже for(int i=5;i>-1;i--) { XX|=int(1<<A[i]); } if(XX==0x7E) {return true;} return false; } bool IntToArray(int X,int &A[]) { ArrayResize(A,6); int x=X%10; if(x==0 || x>6) return false; // главное изменение else A[0]=x; for(int i=1;i<6;i++) { X/=10; x=X%10; if(x==0 || x>6) return false; // главное изменение else A[i]=x; } return true; } Maxim Zaguzov 2011.08.21 22:23 #5097 MetaDriver: О!这并不是一个坏主意。又重写了一遍。 工作时间=125 ms 现在,曲棍球运动员肯定会保持快乐的心情!"。:))))但我不是这个意思!;D 我的代码所显示的时间计数器是多少? 我理解这些变化。我只是还没有掌握它。 for(int i=5;i>-1;i--) { XX|=int(1<<A[i]); } if(XX==0x7E) {return true;} "|="是逻辑上的OR吗?剩下的就是死胡同了... Vladimir Gomonov 2011.08.21 22:29 #5098 MaxZ: 现在,曲棍球运动员肯定会很高兴!:)))) 是的。 你的新代码更快,但那里有一些错误。 for (int A6 = 1; A6 <= 6; A6++) for (int A5 = 1; A5 <= 6; A5++) { if (A5 == A6) continue; for (int A4 = 1; A4 <= 6; A4++) { if (A4 == A5 || A4 == A6) continue; for (int A3 = 1; A3 <= 6; A3++) { if (A3 == A4 || A3 == A5 || A3 == A6) continue; for (int A2 = 1; A2 <= 6; A2++) { if (A2 == A3 || A2 == A4 || A2 == A5 || A2 == A6) continue; for (int A1 = 1; A1 <= 6; A1++) { if (A1 == A2 || A1 == A3 || A1 == A4 || A1 == A5 || A1 == A6) continue; for (int B6 = 1; B6 <= 3; B6++) { if (B6 == A6) continue; for (int B5 = 1; B5 <= 6; B5++) { if (B6 == 3 && B5 > 2) continue; if (B5 == A5) continue; if (B5 == B6) continue; for (int B4 = 1; B4 <= 6; B4++) { if (B4 == A4) continue; if (B4 == B5 || B4 == B6) continue; for (int B3 = 1; B3 <= 6; B3++) { if (B3 == A3) continue; if (B3 == B4 || B3 == B5 || B3 == B6) continue; for (int B2 = 1; B2 <= 6; B2++) { if (B2 == A2) continue; if (B2 == B3 || B2 == B4 || B2 == B5 || B2 == B6) continue; for (int B1 = 1; B1 <= 6; B1++) { if (B1 == A1) continue; if (B1 == B2 || B1 == B3 || B1 == B4 || B1 == B5 || B1 == B6) continue; int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1; int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1; if (MathMod(A, B) == 0) Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B); } } } } } } } } } } } 大括号的数量没有加起来。但我认为这没什么,只要删除最后一个就可以解决。 解释高亮线的含义。我不明白。 Maxim Zaguzov 2011.08.21 22:35 #5099 MetaDriver: 是的。 你的新代码更快,但那里有一些错误。 大括号的数量没有加起来。但我认为这没什么,只要删除最后一个就可以解决。 解释分离线的含义。我不明白。 没错...胡说八道!:)))而括号似乎是可以的,我是从现成的代码中复制的。 应该是这样的。 for (int A6 = 1; A6 <= 6; A6++) for (int A5 = 1; A5 <= 6; A5++) { if (A5 == A6) continue; for (int A4 = 1; A4 <= 6; A4++) { if (A4 == A5 || A4 == A6) continue; for (int A3 = 1; A3 <= 6; A3++) { if (A3 == A4 || A3 == A5 || A3 == A6) continue; for (int A2 = 1; A2 <= 6; A2++) { if (A2 == A3 || A2 == A4 || A2 == A5 || A2 == A6) continue; for (int A1 = 1; A1 <= 6; A1++) { if (A1 == A2 || A1 == A3 || A1 == A4 || A1 == A5 || A1 == A6) continue; for (int B6 = 1; B6 <= 3; B6++) for (int B5 = 1; B5 <= 6; B5++) { if (B6 == 3 && B5 > 2) continue; if (B5 == B6) continue; for (int B4 = 1; B4 <= 6; B4++) { if (B4 == B5 || B4 == B6) continue; for (int B3 = 1; B3 <= 6; B3++) { if (B3 == B4 || B3 == B5 || B3 == B6) continue; for (int B2 = 1; B2 <= 6; B2++) { if (B2 == B3 || B2 == B4 || B2 == B5 || B2 == B6) continue; for (int B1 = 1; B1 <= 6; B1++) { if (B1 == B2 || B1 == B3 || B1 == B4 || B1 == B5 || B1 == B6) continue; if (A6 != B6 && A5 != B5 && A4 != B4 && A3 != B3 && A2 != B2 && A1 != B1) { int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1; int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1; if (MathMod(A, B) == 0) Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B); } } } } } } } } } } } 此外,在MQL5中,它还会加快比较的速度。 if (A > B && MathMod(A, B) == 0) 但125毫秒显然没有追上。 Андрей 2011.08.21 22:35 #5100 或者,也许这一切都在C++中? . 验证--一个参数函数。 老式的方法怎么样...分配内存并缓存一个bool 为所有有效的参数值? 1...503504505506507508509510511512513514515516517...628 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我不喜欢使用continue和break运算符,但也许它们可以帮助你,特别是在mql上的36倍if可能不工作。
并加速 我的代码可以分解if,由一个复杂的36个检查条件组成,变成36个有简单条件的if!:)))
我认为代码的速度会明显加快,尽管要确定你需要了解机器指令,这就是编译的结果。
我在MT5中运行了你的代码。 它已经实现了逻辑运算符的简短评估(内置),所以没有必要将代码分解成大量的ifs。
在MT4中则不同,这种优化在那里是有意义的。但我在MT5中做了时间评估,通过简短的计划。
加速了4倍。 重写了Validate()。
现在是这样的。
工作时间 == 200 ms可怕的是,但用以下方式优化代码是有意义的。快了许多倍!而在这里,MT5不会再有任何帮助。
当然,这不是一个想法。但我想知道它的工作速度会有多快!:))
另外,在代码中,我减少了除数值的范围。654321/2 = 327160,5...
加速了4倍。 重写了Validate()。
现在看起来是这样的。
工作时间 == 200 ms太漂亮了!不像我的。
我有一个想法,要写一个列除法算法。除以数字,写下除法的余数,当结果大于6时,做继续运算。这正是我今天下午所做的,当我翻阅这五份文件时,我把所有东西都分成了几栏。但这是一个漫长的过程!:))
在十六进制的数字表示中,你需要进行优化,正如你所做的那样。
我有一个想法,要写一个列除法算法。除以数字,写下除法的余数,如果符合或结果大于6,就做继续操作。这 正是我今天下午所做的,当我翻阅这五份文件时,我把所有东西都分成了几栏。但这是一个漫长的过程!:))
我们需要优化的是六位数的表述,正如你所做的那样。
О!这并不是一个坏主意。又重写了一遍。 工作时间=125毫秒。
О!这并不是一个坏主意。又重写了一遍。 工作时间=125 ms
现在,曲棍球运动员肯定会保持快乐的心情!"。:))))但我不是这个意思!;D
我的代码所显示的时间计数器是多少?
我理解这些变化。我只是还没有掌握它。
"|="是逻辑上的OR吗?剩下的就是死胡同了...
现在,曲棍球运动员肯定会很高兴!:))))
是的。
你的新代码更快,但那里有一些错误。
大括号的数量没有加起来。但我认为这没什么,只要删除最后一个就可以解决。
解释高亮线的含义。我不明白。
是的。
你的新代码更快,但那里有一些错误。
大括号的数量没有加起来。但我认为这没什么,只要删除最后一个就可以解决。
解释分离线的含义。我不明白。
没错...胡说八道!:)))而括号似乎是可以的,我是从现成的代码中复制的。
应该是这样的。
此外,在MQL5中,它还会加快比较的速度。
但125毫秒显然没有追上。
或者,也许这一切都在C++中?
.
验证--一个参数函数。
老式的方法怎么样...分配内存并缓存一个bool
为所有有效的参数值?