[Archivo] Matemáticas puras, física, química, etc.: problemas de entrenamiento cerebral no relacionados con el comercio de ninguna manera - página 233

 

En general, sin ofender a los desarrolladores de MQL, pero el número de funciones matemáticas https://docs.mql4.com/ru/math

es vergonzosamente pequeño en mi opinión, como lo es en VB. Y las definiciones de algunos de ellos, como MathFloor, son turbias.

-

Tome la función MathMax, sólo hay 2 argumentos. Y si necesito 10 o 20, ¿en qué se convierte?

Esto es lo que parece en VB con mi módulo:

-

x=max(x1...x20) 'encuentra el valor máximo de 20 variables;

x=max(x1, y, z, p) 'encuentra el valor máximo de 4 variables;

 
MaStak >>:

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

El griego debió decir 22/7 (lo mismo que 66/21).

Más preciso sería 355/113 (la precisión es de 3*10^(-7) ).

La siguiente mejor fracción ya es 103993/ 33102 (precisión del orden de 6*10^(-10) ).

2 Richie: Bueno, también tuviste que hacer el VB. Entonces, ¿por qué vas a por las Metacuotas?

 
Señores, ¡pongan por fin su creatividad! No se trata de utilizar este programa para encontrar pi, sino de descifrar cómo lo hizo el programa. Lee el tema: "...problemas de entrenamiento cerebral...". Este programa pertenece a la serie "Fun with C". Hay un concurso para componer los algoritmos en C más oscuros y misteriosos. Tienes el código fuente y el resultado, pero necesitas averiguar el principio de funcionamiento. El algoritmo en sí es la tarea a resolver. Hay que "rajarse". Esto requiere que "rompas" tu cerebro.
 

Toma un chiste


 
Mischek писал(а) >>

Humor

Mischek, somos antiguos postgraduados, estamos resolviendo problemas de 8º grado, no de 11º :)

Pobres niños.

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

Ahí lo tienes, sospechaba que era un problema...

Bien, veamos.

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

Vamos a tratar el primer bucle,

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

El bucle se ejecuta mientras la expresión b - c se evalúe como verdadera. ¿Qué es cierto en C? Todo lo que no sea cero, parece. Así, el bucle que incrementa b desde cero y llena el array f[] se ejecuta hasta que b es igual a c, es decir, hasta 2800. La matriz f[] se llena con los mismos números 10000/5 = 2000.

¿No hay mucho mal hasta ahora?

 

De todos modos, sólo hay una forma de calcular pi, y el resto es una mashka con otra falda, o parte de una mashka :)

 
Mathemat >>:

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

ОК, смотрим.

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

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

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

Vamos a intentarlo.

Bien hasta ahora. Sigamos observando.

 

Pero más adelante no está claro. La condición d=0 en la primera cabecera (bucle exterior) me está molestando de alguna manera. ¿Es siempre cierto?

 

A continuación, un bucle anidado. Lo reescribimos:

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;
}
El orden es especialmente importante en este caso.  ¿Comprobar que no he mentido todavía? 
Entonces seguimos adelante.

// en realidad hablando for(; g=c*2; ) quedaría mucho mejor en esta edición: for( g=c*2; g !=0; )