¿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 ~