Resolução de problemas/Specialized four-digit numbers

Números especiais de 4 dígitos

editar

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

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

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

2991 3000 0 0

Exemplo de saída

editar

2992

2993

2994

2995

2996

2997

2998

2999

Solução do problema

editar

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