Preguntas que debes responder al sprint de las semifinales de CSP-J | P7071 Excelente división

¡Aprende C++ desde pequeño! Registre las preguntas en el proceso de estudio de preparación para el examen CSP-J y registre cada momento.

Adjunto una publicación resumida: Preguntas obligatorias del sprint semifinal de CSP-J | Resumen_Blog de un comunicador que ama la programación-Blog de CSDN


[Descripción del Título]

En términos generales, un número entero positivo se puede dividir en la suma de varios números enteros positivos.

Por ejemplo, 1=1, 10=1+2+3+4, etc. Para una división específica de un entero positivo  n  , la llamamos "excelente" si y solo si bajo esta división, n  se descompone en varias potencias enteras positivas diferentes de 2 . Tenga en cuenta que un número  x  se puede expresar como una potencia entera positiva de 2 si y solo si  x  se puede obtener multiplicando un número entero positivo de 2.

Por ejemplo, 10=8+2=2^3+2^1 es una división excelente. Sin embargo, 7=4+2+1=2^2+2^1+2^0 no es una buena división porque 1 no es una potencia entera positiva de 2.

Ahora, dado un entero positivo  n , es necesario determinar si existe una división excelente entre todas las divisiones de este número. Si existe, proporcione un plan dividido específico.

【ingresar】

La entrada es solo una línea, un número entero  n , que representa el número a juzgar.

【Producción】

Si entre todas las divisiones de este número, hay una división excelente. Luego, debe generar cada número en esta división de mayor a menor, con un espacio que separe dos números adyacentes. Se puede demostrar que este esquema de división es único después de especificar el orden en que se dividen los números.

Si no hay una división excelente, genera -1.

【Muestra de entrada】

6

【Muestra de salida】

4 2

[Explicación detallada del código]

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, ans[100], cnt;
    cin >> n;
    while (n) {
        ans[++cnt] = n % 2;
        n /= 2;
    }
    if (ans[1]) {
        cout << -1;
        return 0;
    }
    for (int i=cnt; i>1; i--) {
        if (ans[i]) {
            cout << (1<<(i-1)) << " ";
        }
    }
    return 0;
}

【resultado de la operación】

6
4 2

Supongo que te gusta

Origin blog.csdn.net/guolianggsta/article/details/133435309
Recomendado
Clasificación