2017-06-03 1 views
0

Problématique: Entrée: 4 entiers M, x, y, z où 100,000 <= M <= 1,000,000 et -500 <= x, y, z <= 500. Nous voulons continuellement multiplier les carrés de ces nombres jusqu'à atteindre un nombre supérieur à M et imprimer ce nombre. Par exemple, si M = 100 000 et x = 2, y = 3, z = 4, puisTrouve le premier nombre supérieur à M résultant de la multiplication continue de 3 entiers

2^2 * 3^2 * 4^2 * 2^2 * 3^2 * 4^2 = 331,776 

Voici ma tentative:

int M, x, y, z, xs, ys, zs, prod_square; 
scanf("%d%d%d%d", &M, &x, &y, &z); 
if (x == 1 && y == 1 && z == 1) { 
    printf("Poor input!\n"); 
    return 0; 
} 
if (x == 0 || y == 0 || z == 0) { 
    printf("Poor input!\n"); 
    return 0; 
} 

xs = x*x; ys = y*y; zs = z*z; 

if (xs > M) printf("%d\n", xs); 

else if (xs*ys > M) printf("%d\n", xs*ys); 

else if (xs*ys*zs > M) printf("%d\n", xs*ys*zs); 

else { 
    prod_square = xs*ys*zs; 
    double temp = (log(M))/(log(prod_square)); 
    int n = (int)temp; 
    int result = pow(prod_square, n); 

    int try1 = result * xs; 
    int try2 = result * xs * ys; 

    if (try1 > M) printf("%d\n", try1); 
    else if (try2 > M) printf("%d\n", try2); 
} 

Cela fonctionne pour beaucoup d'intrants, mais donne la mauvaise réponse pour certains cas de bord. Malheureusement, je n'ai pas accès aux données de test.

Un problème peut être un débordement, mais mes instructions if doivent l'intercepter.

+0

* « certains cas limites » * - Quels sont les cas de pointe? –

+0

Je n'ai pas accès aux données de test sur le juge, tout ce que je reçois est "Mauvaise réponse!". C'est un problème de pratique sur un site web de juge. Cela fonctionne pour les cas que j'ai essayés mais je ne peux pas penser à des cas pour lesquels cela ne fonctionne pas. – user6005857

+0

si l'une des entrées est '0' vous êtes en train d'imprimer comme une mauvaise entrée et continuez à la place, vous devez retourner une valeur – rakesh

Répondre

3

Vous devez utiliser une boucle appropriée pour l'itération. Peut être code suivant être utile:

#include <stdio.h> 

int main() 
{ 
    int M, x, y, z, prod_square; 
    scanf("%d%d%d%d", &M, &x, &y, &z); 
    if (x == 1 && y == 1 && z == 1) 
    { 
     printf("Poor input!\n"); 
     return 0; 
    } 
    if (x == 0 || y == 0 || z == 0) 
    { 
     printf("Poor input!\n"); 
     return 0; 
    } 

    //Now code changes 
    int result=1, indx =0, vals[3]; 
    vals[0] = x*x; 
    vals[1] = y*y; 
    vals[2] = z*z; 

    while(result < M) 
    { 
     result *= vals[indx++]; 
     indx %=3; 
    } 
    printf("%d\n", result); 
    return 0; 
} 

En outre, pour l'entrée donné M = 100,000 et x = 2, y = 3, z = 4 alors sortie doit être

2^2 * 3^2 * 4^2 * 2^2 * 3^2 * 4^2 = 331,776

+0

Je pense que cela devrait fonctionner –

+0

La solution logarithmique fonctionnera, l'OP a juste une erreur dans son code. Cela étant dit, la solution de boucle est également une solution propre. Beau travail de simplification. – pstrjds

-1

je tire de la hanche à ce sujet, mais je suis assez certain que lorsque vous transtypez double en int, il est tronqué vers zéro. Avec votre cas de test, 100 000 2,3,4 vous trouverez que n aura une valeur de 1 après vos journaux, la division et la distribution à int. Lorsque vous appelez pow(prod_square, n) vous revenez prod_square Donc, dans ce code là, vous devez tenir compte de la possibilité de multiplier les trois valeurs à nouveau -

else { 
    prod_square = xs*ys*zs; 
    double temp = (log(M))/(log(prod_square)); 
    int n = (int)temp; // This will truncate towards 0 
    int result = pow(prod_square, n); 

    int try1 = result * xs; 
    int try2 = result * xs * ys; 

    if (try1 > M) printf("%d\n", try1); 
    else if (try2 > M) printf("%d\n", try2); 
    else printf("%d\n", result * prod_square); 
} 
+0

Pouvez-vous s'il vous plaît expliquer la raison de la downvote? Si j'ai manqué quelque chose ou besoin de clarifier quelque chose, je serais heureux de le faire. – pstrjds