2015-07-21 1 views
0

Je pense que ce problème peut être résolu par un nombre entier de racine carrée .... mais
pourquoi ce code affiche une mauvaise réponse ........?uva 10110 Léger, plus de lumière Juges en ligne donne une mauvaise réponse

#include<stdio.h> 
#include<math.h> 
int main(){ 
    long int n; 
    while(scanf("%ld",&n)==1&& n!=0) 
    { 
     long double dbl=(long)sqrt(n); 
     int in=sqrt(n); 
     if(dbl==in) 
      printf("yes\n\n"); 
     else 
      printf("no\n\n"); 
    } 
    return 0; 
} 

link of problem

+1

Si vous voulez vérifier si un nombre est un carré parfait, vous devriez vérifier si 'in * in == n' ou' in == sqrt (n) '. Votre test est redondant car 'dbl' et' in' sont des représentations entières de la racine. –

+0

est-il résolu ???? – coderredoc

+0

Quelle est l'erreur que vous obtenez? erreur de représentation ou WA? – coderredoc

Répondre

0

Ce code est erroné parce que dans math.h, sqrt est défini comme double sqrt(double v); et parce que le calcul flottant de points ne sont pas nécessairement exactes.

Cette ligne long double dbl=(long)sqrt(n); fait beaucoup de chose:

  • convertit n à une double valeur (implicite)
  • calcule la racine carrée de la valeur double en une double
  • convertit le résultat d'un long int (pourquoi?)
  • convertit le long int retour à long double (encore une fois pourquoi?)

sE cond un int in=sqrt(n); fait presque la même (pour le début et petites valeurs):

  • convertit n à un double (implicite)
  • calcule la racine carrée de la valeur double en une double
  • convertir le résultat un int

Ensuite, vous test:

  • convertit la valeur in à une longue double (puisque l'autre partie est)
  • compare les 2 valeurs doubles

Donc, dans les deux parties que vous faites exactement les mêmes opérations de sorte que le résultat ne peut pas être ce que vous voulez.

Comme d'autres ont dit, vous devez:

  • calculer la (double) racine carrée de n converti en double
  • autour d'elle à un int (rond et pas tronquer pour éviter les problèmes de précision stupide)
  • comparer la place de cette int à votre n initial:

code:

#include<stdio.h> 
#include<math.h> 
int main(){ 
    long int n; 
    while(scanf("%ld",&n)==1&& n!=0) 
    { 
     double dbl=sqrt((double) n); 
     int in=(int) (dbl + 0.5); 
     if(in * in == n) 
      printf("yes\n\n"); 
     else 
      printf("no\n\n"); 
    } 
    return 0; 
} 
+0

pourquoi avez-vous utilisé +0.5 avec dbl ...........? –

+0

et que le code affiche également Mauvaise réponse ......................... –

+0

@tanvirsagor: Je l'ai peut-être testé trop rapidement. Quelle valeur d'entrée donne une mauvaise réponse? - '+ .5' est un truc simple pour * arrondir * un point flottant au lieu de le tronquer –