C# -  A Constante de Kaprekar


Hoje vamos tratar da constante de Kaprekar, o enigmático número 6174.

Você sabe o que é a constante de Kaprekar ?

Ela esta relacionada com o número 6174, que parece ser um número mágico ou misterioso...

Vamos entender isso:

1. Escolha qualquer número de quatro dígitos que seja composto por pelo menos dois dígitos diferentes, incluindo zero, por exemplo, 1234....
2. Organize os dígitos em ordem decrescente :  4321.
3. Agora, organize os números em ordem crescente: 1234
4. Subtraia o menor número do maior número: 4321 - 1234 = 3087
5. E agora, com o resultado obtido, repita os últimos três passos Vamos lá:

- Primeiro, organizamos os dígitos em ordem decrescente: 8730
- Depois, em ordem crescente: 0378
- E subtraímos o menor do maior: 8730 - 0378 = 8352
- Novamente, reorganizamos os dígitos e os subtraímos: 8532 - 2358 = 6174.
- Uma vez mais, reordenamos os dígitos e subtraímos: 7641 - 1467 = 6174.

De agora em diante, não vale a pena prosseguir, já que repetiríamos a mesma operação e sempre obteriamos o número 6174.

"O número inteiro 6174 é conhecido como a Constante Kaprekar, batizada em homenagem àquele que descobriu a misteriosa beleza do número 6174 e a apresentou na Conferência Matemática de Madras em 1949, Dattatreya Ramchandra Kaprekar (1905-1986), um viciado confesso na teoria dos números.

"Um bêbado quer continuar bebendo vinho para se manter naquele estado agradável. O mesmo vale para mim quando se trata de números", ele costumava dizer.

Kaprekar era um professor de uma pequena população indiana chamada devlali ou deolali e era frequentemente convidado a falar em outras escolas sobre seus métodos únicos e observações numéricas fascinantes. No entanto, vários matemáticos indianos riam de suas ideias chamando-as de triviais.

Talvez sejam: é fato que, apesar de a Constante de Kaprekar ser surpreendente e nos levar a suspeitar que por trás dela esteja um grande teorema, pelo menos até agora nunca revelou nada...."

Acessado em 28/08/2019 - https://bit.ly/32cXxqG

Vamos então criar um projeto Windows Forms na linguagem C# e mostrar como obter a constante de Kaprekar.

recursos usados:

Criando o projeto no VS 2019 Community

Vamos criar uma aplicação Windows Forms com o .NET Framework usando o Visual Studio 2019 Community chamada WF_Kaprekar.

No formulário padrão Form1.cs vamos incluir a partir da ToolBox os seguintes controles:

  1. 2 Labels
  2. 2 TextBox
  3. 1 Lisbox
  4. 2 Button

Disponha os controles no formulário conforme a figura abaixo:

Vamos criar a classe Calculo no projeto onde vamos definir os métodos estáticos:

Defina o código abaixo para a classe Calculo:

using System;
using System.Collections.Generic;
namespace WF_KapreKar
{
    public class Calculo
    {
            public static List<Resultado> kaprekarConstante(int numero, int valorPrevio,
            List<Resultado> resultados)
             {
                // cria uma instância da classe Resultado
                // gerando objetos operacao onde vamos 
                // armazenar as iterações feitas
                Resultado operacao = new Resultado();
                // armazena o valor atual como o valor anterior
                valorPrevio = numero;
                // Pega 4 digitos do numero informado
                int[] digitos = new int[4];
                for (int i = 0; i < 4; i++)
                {
                    digitos[i] = numero % 10;
                    numero = numero / 10;
                }
                // Ordena os digitos em orden ascendente
                // armazena na variavel valorAscendente  
                Array.Sort(digitos);
                int valorAscendente = 0;
                for (int i = 0; i < 4; i++)
                {
                    valorAscendente = valorAscendente * 10 + digitos[i];
                }
                //atribui o valor ao objeto operacao
                operacao.ValorAscendente = valorAscendente;

                // Ordena os digitos em ordem descendente  
                // e armazena em valorDescendente  
                Array.Sort(digitos);
                int valorDescendente = 0;
                for (int i = 3; i >= 0; i--)
                {
                    valorDescendente = valorDescendente * 10 + digitos[i];
                }
                //atribui o valor ao objeto operacao
                operacao.ValorDescendente = valorDescendente;
                // Obtém a diferenca (absoluta) entre os dois numeros
                int diff = Math.Abs(valorAscendente - valorDescendente);
                //atribui a diferena ao objeto operacao
                operacao.Diferenca = diff;
                //inclui o objeto operação à lista de objetos Resultado
                resultados.Add(operacao);
                // Se a diferença for igual a valorPreveio 
                // alcançamos a constante de Kaprekar
                if (diff == valorPrevio)
                {
                    //retorna as operações realizadas   
                    return resultados;
                }
                // Continua a realizar as operações
                return kaprekarConstante(diff, valorPrevio, resultados);
            }
            // Chama o método passando o número , o valorPrevio(0) 
            // e uma instância da lista de resultados
            public static List<Resultado> Kaprekar(int numero)
            {
                int valorPrevio = 0;
                List<Resultado> resultados = new List<Resultado>();
                return kaprekarConstante(numero, valorPrevio, resultados);
            }
        }
}

Este código foi modificado do original obtido em : https://www.geeksforgeeks.org/kaprekar-constant/

O código já esta comentado e esta classe basicamente vai fazer o seguinte:

Precisamos criar também a classe Resultado onde vamos armazenar a lista das operações feitas:

    public class Resultado
    {
        public int ValorAscendente { get; set; }
        public int ValorDescendente { get; set; }
        public int Diferenca { get; set; }
    }

No formulário Windows Forms temos o seguinte código:

using System;
using System.Windows.Forms;

namespace WF_KapreKar
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void TxtNumero_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar)
&& !char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void BtnVerificar_Click(object sender, EventArgs e)
        {
            int contador = 0;
            if (!string.IsNullOrWhiteSpace(txtNumero.Text)
&& txtNumero.Text.Length == 4)
            {
                lbResultado.Items.Clear();
                int numero = Convert.ToInt16(txtNumero.Text);
                var resultados = Calculo.Kaprekar(numero);               

                foreach (var resultado in resultados)
                {
                    lbResultado.Items.Add(resultado.ValorAscendente + " + " + resultado.ValorDescendente + " = " + resultado.Diferenca);
                    contador++;
                }
                lblOperacoes.Text = $"Foram realizadas {contador.ToString()} iterações";
            }
            else
            {
                MessageBox.Show("Informe um valor numerico de 4 digitos");
            }
        }

        private void BtnLimpar_Click(object sender, EventArgs e)
        {
            txtNumero.Text = string.Empty;
            lbResultado.Items.Clear();
            lblOperacoes.Text = string.Empty;
        }
    }
}

O código acima somente permite o usuário informar valores numéricos com 4 digitos e chama o método Kaprekar() da classe Calculo: Calculo.Kaprekar(numero); 

"Em outras investigações, descobriu-se que o mesmo fenômeno ocorre quando, em vez de começar com quatro dígitos, começa com três.

Vamos tentar com o número 574?
754 - 457 = 297
972 - 279 = 693
963 - 369 = 594
954 - 459 = 495
954 - 459 = 495

Como se pode ver, o "número mágico" neste caso é 495.

E não, isso não acontece em outros casos: somente com números de três ou quatro dígitos (pelo menos de 2 a 10 dígitos, que é o que foi testado)"

Acessado em 28/08/2019 - https://bit.ly/32cXxqG

Executando o projeto teremos o seguinte resultado:

Pegue o código do projeto aqui : WF_KapreKar.zip

"Porque o Senhor é justo, e ama a justiça; o seu rosto olha para os retos."
Salmos 11:7


Referências:


José Carlos Macoratti