题干:
小艺定义一个幸运数字的标准包含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
是翻转后的数字。所以,rev
和n
已经不是同一个数字了,因此判断的结果始终是错误的。
要解决这个问题,可以改进代码中的判断逻辑。我们可以在翻转数字之后,再进行判断,如下所示:
(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;
}
这样修改后,代码应该能正确判断给定的数字是否符合幸运数字的条件。