2014-10-29 51 views
-3

輸入 每個測試用例包含兩個數A和B. 這兩個數可以大於5000個比特這兩個代碼是相似的,爲什麼第一個是錯的?

輸出對於每個情況下,如果A等於B,你應該打印「YES」,或打印「沒有」。

採樣輸入

樣本輸出

NO
YES
YES
NO

我已經嘗試了很多次,輸出是正確的,但是爲什麼當我提交時它是錯誤的答案?

#include<iostream> 
#include<string> 
using namespace std; 

string cut(string X) 
{ 
    long i; 
     if(X.find(".")!=X.npos) 
     { 
      i=X.length(); 
      while((X[--i]=='0'||X[i]=='.')&&i >0) X.erase(i,1); 
     } 
     while((X[0]=='0')&&X.length()>1) X.erase(0,1); 
     if(X==".") X="0"; 
    return X; 
} 

int main() 
{ 
    string A,B; 
    while(cin>>A>>B) 
    { 
      if(cut(A)==cut(B)) cout<<"YES"<<endl; 
      else cout<<"NO"<<endl; 
    } 
    return 0; 
} 

爲什麼上面的代碼不正確,而下面的代碼是正確的?

#include <iostream> 
#include <string> 
using namespace std; 

string a, b; 
char t; 
long i; 

int 
main (void) { 
    while (cin >> a >> b) { 
     if (a.find(".") != a.npos) { 
      i = a.length(); 
      while ((a[--i] == '0' || a[i] == '.') && i > 0) { 
       t = a[i]; 
       a.erase(i, 1); 
       if (t == '.') break; 
      } 
     } 
     if (b.find(".") != b.npos) { 
      i = b.length(); 
      while ((b[--i] == '0' || b[i] == '.') && i > 0) { 
       t = b[i]; 
       b.erase(i, 1); 
       if (t == '.') break; 
      } 
     } 
     while ((a[0] == '0') && a.length() > 1) {a.erase(0, 1);} 
     while ((b[0] == '0') && b.length() > 1) {b.erase(0, 1);} 
     if (a == ".") a = "0"; 
     if (b == ".") b = "0"; 
     if (a == b) cout << "YES" << endl; 
     else cout << "NO" << endl; 
    } 
    return 0; 
} 
+2

'cut()'做了什麼?爲什麼在沒有人的時候在輸入中尋找'.'? – Galik 2014-10-29 11:50:04

+0

因爲沒有'iostream'頭文件? – 2014-10-29 11:51:15

+0

,因爲它需要我們考慮這些情況:0.000010000和0.00001.或0000.0000和0。或者,如果我只是做最簡單的比較 – Jacqueline 2014-10-29 11:52:14

回答

0

「這兩個數字可能超過5000位。」這是在C而不是C++,但大部分代碼將是相同的。它從輸入中去除前導和尾隨的東西,但不處理實際的數字,只是數字字符串。

#include <stdio.h> 
#include <string.h> 

char a [10000]; 
char b [10000]; 

char *strip (char *str) 
// remove unnecessary leading and trailing chars from a number string 
// return pointer to first significant char 
{ 
    int z; 

    // strip leading numeric zeros 
    while (*str=='0') 
     str++; 

    // strip trailing zeros after (and/or including) decimal point 
    if (strrchr (str, '.')) 
     for (z=strlen(str)-1; z>=0; z--) { 
      if (str[z] == '.') { 
       str[z] = 0;   // truncate 
       break; 
      } 
      if (str[z] !='0') { 
       str[z+1] = 0;   // truncate 
       break; 
      } 
     } 
    return str; 
} 

int main(void) 
{ 
    scanf ("%s%s", a, b); 
    if (strcmp (strip(a), strip(b)) == 0) 
     printf ("YES\n"); 
    else printf ("NO\n"); 
    return 0; 
} 
3

究竟爲什麼你不只是做:

#include<iostream> 

int main() { 
    int a, b; 
    while (std::cin >> a >> b) { 
     std::cout << (a == b ? "YES" : "NO"); 
    } 
} 
+0

是錯誤的,因爲它需要我考慮許多像這樣的情況:0.010000和0.01或01203和1203 ....如果我寫的像你發佈的內容,這將是一個錯誤的答案。 – Jacqueline 2014-10-29 12:01:36

+0

如果你想讓01203不等於1203,那麼就把它們作爲字符串進行比較。如果您想比較數值,@Paul是正確的。 – 2014-10-29 12:07:02

+0

01203等於1203和0.0000等於0 ...我不能用int或double來比較它們。 – Jacqueline 2014-10-29 12:18:41

0

編輯:如果你想讓它像0123箱子等於1230.0200004等於與000.020000400000然後使用這個:

#include<iostream> 

int main() { 
    float A, B; 

    while (std::cin >> A >> B) 
    { 
     if(A != B) 
     { 
      std::cout << "NO" << std::endl; 
     } 
     else 
     { 
      std::cout << "YES" << std::endl; 
     } 
    } 
} 
+0

01203等於1203和0.0000等於0 ...我不能只用int或double來比較它們.. – Jacqueline 2014-10-29 12:21:29

+0

@Jacqueline然後使用浮動。 – bitcell 2014-10-29 12:26:23

+0

我剛剛發佈了你寫的內容,這也是錯誤的,我感到困惑 – Jacqueline 2014-10-29 12:33:40