[アーカイブ!】純粋数学、物理学、化学など:トレードとは一切関係ない脳トレ問題集 - ページ 233

 

一般に、MQLの開発者に悪気はないのですが、数学関数の数https://docs.mql4.com/ru/math

は、VBでもそうですが、みっともないほど小さいと思います。また、MathFloorの ように定義が 曖昧 なものもあります。

-

MathMax関数を例にとると、引数は2つだけである。そして、10個、20個必要だとしたら、それは何に変わるのでしょうか?

私のモジュールを使ってVBで表示するとこんな感じです。

-

x=max(x1...x20) '20個の変数のうち最大値を求める。

x=max(x1, y, z, p) '4つの変数の最大値を求める。

 
MaStak >>:

А вобще, какой то грек сказал что Pi=66/21

ギリシャ語では、22/7(66/21と同じ)と言ったのだろう。

より正確には、355/113(精度は3*10^(-7))となります。

次に良い分数はすでに103993/ 33102(精度は6*10^(-10)のオーダー)です。

2 Richie: そうですね、VBも完成させないといけないですからね。じゃあ、なんでメタクソを狙うんだ?

 
諸君、最後にクリエイティブになろうポイントは、このプログラムを使って円周率を求めることではなく、プログラムがどのように円周率を求めたかを解読することです。お題「...脳トレの問題...」を読む。このプログラムは、「Fun with C」シリーズです。最も曖昧で謎めいたCアルゴリズムを作曲するコンテストがある。ソースコードも結果も出ているが、動作原理を把握する必要がある。アルゴリズムそのものが、解決すべき課題なのです。割れる」ことが必要なのです。そのためには、自分の脳を「壊す」ことが必要です。
 

冗談を言う


 
Mischek писал(а)>>

ユーモア

ミシェック、 私たちは 元大学院生で、11年生ではなく8年生の問題を解いているんだ :)

子供がかわいそうだ。

 
C-4 >>: Сам алгоритм - это и ест задача для решения. Его надо "взломать". Для этого требуется "поломать" свой мозг.

ほらね、疑ってたんだよ...。

よし、見てみよう。

int a=10000, b, c=2800, d, e, f[2801], g;
int main(void){
   for(; b- c;) f[ b++]= a/5;
   for(; d=0, g= c*2; c-=14,printf("%.4d", e+ d/ a), e= d% a)
      for( b= c; d+= f[ b]* a, f[ b]= d%-- g, d/= g--,-- b; d*= b);
}

最初のループを処理しよう。

   for(; b- c;) f[ b++]= a/5;

ループは式b - cが真と評価される限り実行される。C言語では何が正しいのか?ゼロでないものなら何でもいいようです。そこで、bを0から増加させ、配列f[]を埋めていくループをbがcに等しくなるまで、つまり2800まで実行します。配列f[]には、同じ数字10000/5=2000が入る。

今のところ、あまり問題はない?

 

どうせ円周率の計算方法は一つしかないんだし、あとは別のスカートでマシュカか、マシュカの一部か :)

 
Mathemat >>:

Ну вот, подозревал ведь, что это задачка...

ОК, смотрим.

Разбираемся с первым циклом,

Цикл выполняется до тех пор, пока b - c = true. Что такое true в Си? Кажись, любой не нуль. Значит, цикл увеличения b от нуля и заполнения массива f[] выполняется до тех пор, пока b не сравняется с с, т.е. до 2800. Массив f[] заполняется одинаковыми числами 10000/5 = 2000.

Пока не сильно ошибся?

さあ、挑戦してみましょう。

今のところ右です。これからも見守りましょう。

 

しかし、さらにその先は不明です。最初のヘッダ(外周ループ)の条件d=0が何となく気になる。いつもそうなのでしょうか?

 

次に、ネストされたループ。書き換えます。

for( ; g= c*2; )
{
d=0;
   for( b= c; -- b; d*= b)
{
d += f[ b] * a;
g
--;
 f[ b] = d % g;
 d /= g;
g--;
}
c-=14;
printf("%.4d", e+ d/ a);
e= d% a;
}
ここでは特に順番が重要です。  まだ嘘をついてないか確認する? 
そして、次に進みます。

// 実際には、for(; g=c*2; ) は、 このエディションではもっと良く見えるでしょう: for( g=c*2; g !=0; )