[Arquivo!] Pura matemática, física, química, etc.: problemas de treinamento do cérebro não relacionados ao comércio de qualquer forma - página 233

 

Em geral, sem ofensa aos desenvolvedores da MQL, mas o número de funções matemáticas https://docs.mql4.com/ru/math

é vergonhosamente pequeno em minha opinião, como é em VB. E as definições de algumas delas, como MathFloor, são obscuras.

-

Assumindo a função MathMax, há apenas 2 argumentos. E se eu precisar de 10 ou 20, em que é que isso se transforma?

Isto é o que parece em VB com meu módulo:

-

x=max(x1...x20) 'encontra o valor máximo de 20 variáveis;

x=max(x1, y, z, p) 'encontra o valor máximo de 4 variáveis;

 
MaStak >>:

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

O grego deve ter dito 22/7 (o mesmo que 66/21).

Mais preciso seria 355/113 (a precisão é 3*10^(-7) ).

A próxima melhor fração já é 103993/ 33102 (precisão na ordem de 6*10^(-10) ).

2 Richie: Bem, você tinha que terminar o VB também. Então, por que você está indo atrás do Metacquotes?

 
Cavalheiros, sejam finalmente criativos! O objetivo não é usar este programa para encontrar pi, mas para decifrar como o programa o fez. Leia o assunto: "...problemas de treinamento do cérebro...". Este programa é da série "Diversão com C". Há um concurso para compor os algoritmos C mais obscuros e misteriosos. Você tem o código fonte e o resultado, mas você precisa descobrir o princípio de operação. O algoritmo em si é a tarefa a ser resolvida. Precisa ser "rachado". Isto exige que você "quebre" seu cérebro.
 

Pegue uma piada


 
Mischek писал(а) >>

Humor

Mischek, somos ex-pós-graduados, estamos resolvendo problemas do 8º ano, não do 11º :)

Pobres crianças.

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

Aí está, eu suspeitava que era um problema...

Ok, vamos ver.

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 lidar com a primeira etapa,

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

O laço é executado desde que a expressão b - c seja avaliada como verdadeira. O que é verdade em C? Qualquer coisa que não seja zero, ao que parece. Assim, o loop aumentando b de zero e a matriz de enchimento f[] é executada até b igual a c, ou seja, até 2800. Array f[] é preenchido com os mesmos números 10000/5 = 2000.

Não há muito errado até agora?

 

Só há uma maneira de calcular pi de qualquer maneira, e o resto é uma mashka com uma saia diferente, ou parte de uma mashka :)

 
Mathemat >>:

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

ОК, смотрим.

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

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

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

Vamos fazer uma rachadura.

Até agora, tudo bem. Vamos continuar observando.

 

Mas, mais adiante, não está claro. A condição d=0 no primeiro cabeçalho (laço externo) está me incomodando de alguma forma. Isso é sempre verdade?

 

Em seguida, um loop aninhado. Nós a reescrevemos:

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;
}
A ordem é particularmente importante aqui.  Cheque que eu ainda não menti? 
Depois seguimos em frente.

// realmente falando por(; g=c*2; ) ficaria muito melhor nesta edição: for( g=c*2; g !=0; )