Cita de: Loretz en 24 Febrero 2019, 07:11 AM
Debe haber por ahí alguna fórmula genial, de esas del tipo (a+b)^2 que nos deje a todos con la boca abierta, pero andando a pie, siguiendo la descripción más pedestre posible, mi algoritmo es este:Código [Seleccionar]#include <iostream>
#include <cmath>
#include <array>
int main()
{
// el primer círculo empieza en 2 y termina en 9
// el segundo empieza en 10 y termina en 25
// el tercero ... de 26 a 49 ...
// Claramente, cada círculo empieza donde termina el anterior y
// terminan en 9 (3*3) o en 25 (5*5) o en 49 (7*7) ... [los cuadrados del número de elementos de sus lados]
// También, cada círculo tiene elementos que están más próximos al centro y están ubicados en cruz:
// Se ve que en la rama de la derecha de esa cruz están:
// el 2 (primer círculo),
// el 11 (su número de círculo + los elementos del círculo anterior = 2 + 9),
// el 28 (su número de círculo + los elementos del círculo anterior = 3 + 25).
// y lo mismo para los siguientes...
// Mirando también en las otras direcciones,
// el primer círculo tiene en esa cruz al 2, que es por donde empieza,
// y en las otras ramas al 4 (o sea, el 2 + su número de elementos por lado = 4),
// tiene también al 6 (4 + su número de elementos por lado = 6)
// y al 8 (6 + su número de elementos por lado -1 == 8).
// Así que para el primer círculo esa cruz está formada por el 2, 4, 6, 8.
// Lo mismo para los otros círculos:
// el segundo círculo tiene al 11, 15, 19 y 23.
// Cada círculo va a tener 4 números sobre la cruz:
// el primero que está en el brazo horizontal de la derecha
// y los otros tres distando entre sí la cantidad de elementos en cada lado.
// Bueno, eso es todo.
// Para calcular la distancia al centro de un número cualquiera habrá que calcular
// la distancia a la rama más próxima de la cruz y sumar su número de círculo.
// Por ejemplo: dado un númeo cualquiera:
int n;
std::cout << "numero: ";
std::cin >> n;
// Se puede determinar a qué círculo pertenece:
int c = 0;
for (int i = 1; ; i += 2, ++c) { // 1, 3, 5, 7, ...
if (i*i >= n) {
break;
}
}
std::cout << n << " pertenece al circulo " << c << '\n';
// Este círculo tiene 4 números sobre la cruz central:
std::array<int, 4> cruz;
// El primero (rama de la derecha) es:
cruz[0] = c + (2 * c - 1)*(2 * c - 1); // su número de círculo más los elementos del círculo anterior
// y los otros tres van a ser:
for (int i = 1; i < 4; ++i) {
cruz[i] = cruz[i - 1] + c * 2; // número anterior en la cruz + cantidad de elementos del lado
}
std::cout << "los elementos de la cruz son: ";
for (const auto& i : cruz) {
std::cout << i << " ";
}
std::cout << '\n';
// Ahora, la distancia al centro de este número es:
// la distancia al elemento de la cruz más cercano + su número de círculo:
int dist_cruz = 1000; // absurdamente grande
for (int i = 0; i < 4; ++i) {
if(abs(cruz[i] - n) < dist_cruz) {
dist_cruz = abs(cruz[i] - n);
}
}
int distancia = dist_cruz + c;
std::cout << "distancia al centro = " << distancia << '\n';
}
Muchísimas gracias!!