2015-07-21 59 views
0

我認爲這個問題可以通過一個平方根int數來解決....但
爲什麼這段代碼顯示錯誤的答案........?uva 10110燈,多燈在線評委給出錯誤的答案

#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

如果你想檢查一個數是否是一個完美的正方形,你應該檢查'in * in == n'或'in == sqrt(n)'。你的測試是多餘的,因爲'dbl'和'in'都是根的整數表示。 –

+0

它解決了嗎? – coderredoc

+0

你正在收到什麼錯誤?表示錯誤或WA? – coderredoc

回答

0

此代碼是錯誤的,因爲在math.h中,SQRT被定義爲double sqrt(double v);和因爲浮點運算不一定準確。

此行long double dbl=(long)sqrt(n);做很多事情:

  • 轉換n至雙值(隱含)
  • 計算雙重價值的平方根爲雙
  • 將結果轉換爲long int (爲什麼?)
  • 的長整型轉換回長雙(又爲什麼?)

硒COND一個int in=sqrt(n);做幾乎相同(開始和小的值):

  • 轉換n至雙(隱含)
  • 計算雙精度值的平方根成一個雙
  • 將結果轉換爲一個int

然後你測試:

  • in值轉換爲長雙(因爲其他部分)
  • 2個值

所以在這兩個部分,你做同樣的操作,使結果不能是你想要的東西進行比較。

正如其他人說你應該:

  • 計算n的(雙)平方根轉換爲雙
  • 一輪它爲int(圓形,而不是截斷,以避免愚蠢的準確性問題)
  • 這個中斷的平方比較您最初的N:

代碼:

#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

爲什麼你在dbl中使用+0.5 ...........? –

+0

,該代碼也顯示錯誤答案......................... –

+0

@tanvirsagor:我可能已經過快測試了。什麼輸入值會給錯誤的答案? - '+ .5'是一個簡單的技巧,可以*圓*浮點而不是截斷它 –