[Архив!] Чистая математика, физика, химия и т.п.: задачки для тренировки мозгов, никак не связанные с торговлей - страница 233

 

Вообще, не в обиду разработчикам MQL будет сказано, но количество математических функций https://docs.mql4.com/ru/math

на мой взгляд, позорно мало, как впрочем и в VB. А определения некоторых из них, типа MathFloor, являются мутными.

-

Возьмём функцию MathMax, там только 2 аргумента. А если мне нужно 10 или 20, тогда во что это превращается?

Вот как это выглядит на VB с моим модулем:

-

х=max(х1...х20) 'находит максимальное значение 20 переменных;

х=max(х1, у, 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". Есть такой конкурс на составление самых непонятных и загадочных алгоритмов на Си. Исходный код есть, результат - есть, а принцип действия требуется разгадать. Сам алгоритм - это и ест задача для решения. Его надо "взломать". Для этого требуется "поломать" свой мозг.
 

Приколитесь


 
Mischek писал(а) >>

Приколитесь

Mischek, мы тут бывшие аспиранты, задачи для 8-го класса решаем, а не для 11-го :)

Бедные детишки :(

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

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

 

Всё равно число Пи вычисляется только одним способом, а всё остальное - это машка в другой юбке, либо часть машки :)

 
Mathemat >>:

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

ОК, смотрим.

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

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

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

Ну давай крякнем.

Пока правильно. Смотрим дальше.

 

А вот дальше непонятка. В первой шапке (внешнем цикле) условие d=0 как-то напрягает. Это ж всегда true?

 

Дальше вложенный цикл. Переписываем:

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; )