Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Qué debo hacer en la Pregunta 797 de Programación Rápida?

¿Qué debo hacer en la Pregunta 797 de Programación Rápida?

Los números enteros que constan únicamente de 5 y 8 se ordenan de la siguiente manera:

5 8 ///?Un dígito ***2

55 58 85 88 // ? Dos dígitos ***2^2

555 558 585 588 855 858 885 888 ///? Tres dígitos ***2^3

...

n dígitos -***2 2^2 ... 2^n=2^(n 1)-2

A partir de esto, se puede obtener la relación entre n y k, entre Números de n dígitos, el dígito más alto de la primera mitad es 5 y el dígito más alto de la segunda mitad es 8.

El valor de cada dígito se puede obtener de forma recursiva.

El código C es el siguiente:

#includelt;iostreamgt;

#includelt;cmathgt;

#includelt;stringgt;

usando namespace std ;

string ans //?Guardar el resultado final

void dfs(int k) {

if (k lt; = 2) {

char c = k == 1 ? '5' : '8';

ans.push_back(c

retorno; >

}

int n = (int)log2(k 1); // El número es de n dígitos

int start = (int)pow(2, n) - 1;

int half = (int)pow(2, n - 1); // la mitad del número de n dígitos

if (k - start 1 lt; = half) { // ¿Qué número entre n dígitos?

ans.push_back('5');

k -= half;

}

else {

ans.push_back('8');

k -= mitad * 2; > dfs(k); // Continuar determinando el siguiente dígito

}

int main() {

cout lt; Los primeros 50 números enteros que constan de la suma 8:\n";

for (int i = 1; i lt; = 50; i) {

ans.clear() ;

dfs(i);

cout lt;lt; ans lt;lt; " ";

si (i 10 == 0) cout lt ;lt; "\n";

}

int k;

cout lt;lt; "\nIngrese un número entero que consista únicamente en 5 y 8 número en: \n";

cin gt; gt; k;

ans.clear();

dfs(k);

cout lt;lt; "th" lt;lt; k lt;lt; "El número es: " lt;lt; ans lt;lt; >

}

g Se pasa la compilación y los resultados de la ejecución son los siguientes:

Se generan los primeros 50 números y el número 1000, que cumple con los requisitos y es se espera que sea adoptado ~