[Archives] Mathématiques pures, physique, chimie, etc. : problèmes d'entraînement cérébral sans rapport avec le commerce. - page 233

 

En général, sans vouloir offenser les développeurs de MQL, le nombre de fonctions mathématiques https://docs.mql4.com/ru/math.

est honteusement petite à mon avis, comme elle l'est en VB. Et les définitions de certains d'entre eux, comme MathFloor, sont obscures.

-

Prenez la fonction MathMax, il n'y a que 2 arguments. Et si j'ai besoin de 10 ou 20, alors qu'est-ce que ça donne ?

Voici à quoi cela ressemble en VB avec mon module :

-

x=max(x1...x20) 'trouve la valeur maximale de 20 variables ;

x=max(x1, y, z, p) 'trouve la valeur maximale de 4 variables ;

 
MaStak >>:

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

Le grec a dû dire 22/7 (comme 66/21).

Plus précis serait 355/113 (la précision est de 3*10^(-7) ).

La prochaine meilleure fraction est déjà 103993/ 33102 (précision de l'ordre de 6*10^(-10) ).

2 Richie : Eh bien, vous avez dû faire le VB aussi. Alors, pourquoi tu t'en prends aux Metacquotes ?

 
Messieurs, soyez enfin créatifs ! Le but n'est pas d'utiliser ce programme pour trouver pi, mais de déchiffrer comment le programme l'a fait. Lire le sujet : "...problèmes d'entraînement du cerveau...". Ce programme fait partie de la série "Fun with C". Il existe un concours pour la composition des algorithmes C les plus obscurs et mystérieux. Vous avez le code source et le résultat, mais vous devez comprendre le principe de fonctionnement. L'algorithme lui-même est la tâche à résoudre. Il faut le "craquer". Cela exige que vous "cassiez" votre cerveau.
 

Faire une blague


 
Mischek писал(а) >>

Humour

Mischek, nous sommes d'anciens postgradués ici, nous résolvons des problèmes de 8ème année, pas de 11ème :)

Pauvres enfants.

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

Voilà, je me doutais bien qu'il y avait un problème...

OK, voyons voir.

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

Traitons la première boucle,

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

La boucle est exécutée tant que l'expression b - c est évaluée comme vraie. Qu'est-ce qui est vrai en C ? Tout ce qui n'est pas zéro, il semble. Ainsi, la boucle augmentant b de zéro et remplissant le tableau f[] est exécutée jusqu'à ce que b soit égal à c, c'est-à-dire jusqu'à 2800. Le tableau f[] est rempli avec les mêmes nombres 10000/5 = 2000.

Pas de problème jusqu'à présent ?

 

Il n'y a qu'une seule façon de calculer pi de toute façon, et le reste est une mashka dans une autre jupe, ou une partie d'une mashka :)

 
Mathemat >>:

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

ОК, смотрим.

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

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

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

Faisons un essai.

Bien jusqu'à présent. Continuons à regarder.

 

Mais plus loin, ce n'est pas clair. La condition d=0 dans le premier en-tête (boucle externe) me dérange en quelque sorte. Est-ce toujours vrai ?

 

Ensuite, une boucle imbriquée. Nous le réécrivons :

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;
}
L'ordre est particulièrement important ici.  Vérifier que je n'ai pas encore menti ? 
Ensuite, on passe à autre chose.

// en fait, for(; g=c*2; ) serait beaucoup mieux dans cette édition : for( g=c*2; g !=0 ; )