这两个代码是相似的,为什么第一个是错的?

时间:2014-10-29 11:46:42

标签: c++

输入 每个测试用例包含两个数字A和B. 这两个数字可能超过5000位

每种情况的输出,如果A等于B,则应打印“是”,或打印“否”。

示例输入

1 2
2 2
3 3
4 3

示例输出

NO
YES
YES
没有

我已经尝试了很多次,输出是正确的但是当我提交它时为什么它是错误的答案?

#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;
}

3 个答案:

答案 0 :(得分:3)

为什么你不这么做:

#include<iostream>

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

答案 1 :(得分:0)

编辑:如果您希望 0123等于123 0.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;
        }
     }
 }

答案 2 :(得分: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;
}