Resolução de problemas/Specialized four-digit numbers
Números especiais de 4 dígitos
[editar | editar código-fonte]Este problema tem como objetivo achar todos os números(em notação decimal), em um dado intervalo, que tenham um mesmo valor como soma de seus dígitos em notação decimal, em notação dodecimal, e em notação hexadecimal. Como exemplo, peguemos o número 2991(em notação decimal, 10). Já que 2991(10) = 1*1728 + 8*144 + 9*12 + 3, sua representação em notação dodecimal é 1893(12). Em notação hexadecimal, 2991(10)=BAF(16). Note que a soma dos dígitos desse número em notação decimal é 2+9+9+1=21, que é igual a 1+8+9+3=21, mas que é diferente de 11+10+15=36(B+A+F). Portanto, este número deve ser rejeitado pelo problema.
Por outro lado, o número 2992(10) tem a mesma soma de dígitos em suas três representações(2+9+9+2=22, 1+8+9+4=22 e 11+11+0=22), devendo portanto ser incluído entre as soluções da entrada. a seguir, apresentamos o formato de entrada e de saída do programa.
Entrada
[editar | editar código-fonte]A entrada irá conter dois inteiros positivos, representando o intervalo de números que queremos verificar. A entrada irá terminar quando os dois inteiros forem iguais a 0.
Saída
[editar | editar código-fonte]A saída para cada caso de teste da entrada será o conjunto dos números inteiros que satisfazem as propriedades dos números especiais de 4 dígitos.
Exemplo de entrada
[editar | editar código-fonte]2991 3000 0 0
Exemplo de saída
[editar | editar código-fonte]2992
2993
2994
2995
2996
2997
2998
2999
Solução do problema
[editar | editar código-fonte]Para a solução deste problema, inicialmente declaramos 3 vetores globais, que armazenarão os dígitos em cada representação:
int vetor10[5],vetor12[5],vetor16[5];
A seguir, criamos uma função para setar todos esses valores para 0:
void seta() {
int i;
for (i=0;i<=4;i++) {
vetor10[i]=0;
vetor12[i]=0;
vetor16[i]=0;
}
}
A primeira função de conversão que iremos criar é uma que recebe um inteiro como instância, e joga cada dígito(em decimal) do número em cada posição do vetor "vetor10":
void dez_to_10 (int x) {
int i,aux=x;
vetor10[3]=aux/1000;
aux%=1000;
vetor10[2]=aux/100;
aux%=100;
vetor10[1]=aux/10;
aux%=10;
vetor10[0]=aux;
}
A segunda função de conversão terá uma instância inteira, irá converter os dígitos da instância para a notação dodecimal e jogar cada dígito dodecimal em cada posição do vetor "vetor12":
void dez_to_12 (int x) {
int i,aux=x;
vetor12[3]=aux/1728;
aux%=1728;
vetor12[2]=aux/144;
aux%=144;
vetor12[1]=aux/12;
aux%=12;
vetor12[0]=aux;
}
A terceira função de conversão fará o análogo à função anterior, com a diferença de que ela irá converter os dígitos para hexadecimal, e colocá-los em cada posição do vetor "vetor16":
void dez_to_16(int x) {
int i,aux=x;
vetor16[3]=aux/4096;
aux%=4096;
vetor16[2]=aux/256;
aux%=256;
vetor16[1]=aux/16;
aux%=16;
vetor16[0]=aux;
}
As três funções a seguir calculam a soma dos dígitos em cada notação:
int soma10() {
int i,soma=0;
for (i=0;i<=3;i++) {
soma+=vetor10[i];
}
return soma;
}
int soma12() {
int i,soma=0;
for (i=0;i<=3;i++) {
soma+=vetor12[i];
}
return soma;
}
<syntaxhighlight lang="cpp">
int soma16() { int i,soma=0; for (i=0;i<=3;i++) { soma+=vetor16[i]; } return soma; }
A seguinte função verifica se o número é especial de 4 dígitos ou não: int specialized(int x) { dez_to_16(x); dez_to_12(x); dez_to_10(x); if (soma10()==soma12() && soma12()==soma16()) return true; else return false; } </syntaxhighlight> Para finalizar, temos a nossa função principal:
int main () {
int x=-1,y=-1,k,counter=0;
while (!(x==0 && y==0)) {
seta();
scanf ("%d %d",&x,&y);
if (!(x==0 && y==0) && counter>0)
printf ("\n");
counter++;
if (!(x==0 && y==0)) {
for (k=x;k<=y;k++) {
if (specialized(k)==true && k!=0) {
if (k<1000)
printf ("000");
printf ("%d\n",k);
}
}
}
}
return 0;
}
Texto explicativo escrito por: Samuel Lincoln Magalhães Barrocas