case不能100%通过,当把Yes改成YES时,case通过率60%,写成Yes时通过率40%

题干:
小艺定义一个幸运数字的标准包含3条: 1、仅包含4和7。 2、数字的前半部分等于后半年部分。 3、数字的长度是偶数。

输入描述:输入整数n。(1<=n<=1e1000)

输出描述:如果数字n是幸运数字输出“Yes”,否则输出“No”

示例
输入:4774
输出:Yes

问题:我不懂我代码有什么问题,为什么case不能100%通过,当把Yes改成YES时,case通过率60%,写成Yes时通过率40%

#include <iostream>
using namespace std;

int main(void)
{
    int n;
    string tS = "YES";
    string fs = "No";
    cin >> n;
    int rev = 0;
    while(n > rev) {
        if(((n % 10) != 4) && ((n % 10) != 7)) {
            cout << fs;
            return 0;
        }
        rev = rev * 10 + n % 10;
        n /=10;
    }
    (rev == n) ? cout << tS : cout << fs;
    return 0;
}

你似乎没有引入string库。

题目提供了n的范围(1<=n<=1e1000)
此时就不能用int,用字符串保存进行判断。

【以下回答由 GPT 生成】

问题出在代码中对结果进行判断时的逻辑错误。具体来说,代码中使用了三元表达式rev == n ? cout << tS : cout << fs;来判断结果是输出"YES"还是输出"No"。然而,此时的n已经被除以了10,并且rev是翻转后的数字。所以,revn已经不是同一个数字了,因此判断的结果始终是错误的。

要解决这个问题,可以改进代码中的判断逻辑。我们可以在翻转数字之后,再进行判断,如下所示:

(rev == n) ? cout << tS : cout << fs;

应该改为:

(rev == n * 10) ? cout << tS : cout << fs;

这样,判断的就是正确的数字了。完整的代码如下:

#include <iostream>
using namespace std;

int main(void)
{
    int n;
    string tS = "YES";
    string fs = "No";
    cin >> n;
    int rev = 0;
    while(n > rev) {
        if(((n % 10) != 4) && ((n % 10) != 7)) {
            cout << fs;
            return 0;
        }
        rev = rev * 10 + n % 10;
        n /= 10;
    }
    (rev == n * 10) ? cout << tS : cout << fs;
    return 0;
}

这样修改后,代码应该能正确判断给定的数字是否符合幸运数字的条件。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^