【问题标题】:C++ cin can't read in integers with 0 in themC++ cin 无法读取其中包含 0 的整数
【发布时间】:2015-06-09 19:10:18
【问题描述】:

我在hackerrank,遇到了一个非常奇怪的问题。问题是“给你一个整数 N。找到这个数字中正好除以 N 的数字(除以 0 作为余数)并显示它们的计数。对于 N = 24,有 2 个数字(2 和 4)。两者这些数字中的 24 个正好除以 24。所以我们的答案是 2。”。这是我的解决方案:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
    int t, count;

    cin >> t;
    for (int i = 0; i < t; i++) {
        int n, copy;
        cout << "i: " << i << " ";
        cin >> n;
        cout << "n: " << n << " ";
        copy = n;
        count = 0;
        while (copy > 0) {
            if (n % (copy % 10) == 0)
                count++;
            copy = copy/10;
        }
        cout << "\n" << count << "\n";
    }  
    return 0;
}

t 是测试用例的数量,n 是要测试的数量。我可以毫无问题地将任何我想要的数字输入到 t 中。但是,如果我在 n 中输入一个带零的数字,则会出现浮点异常错误。错误发生在第二个 cout 语句之前。其他数字可以正常工作(例如,1024 会出错,但 1124 可以)。我在hackerrank网站上运行了这段代码。有人可以解释发生了什么吗?

【问题讨论】:

  • 在使用前尝试打印出 n,你得到你的输入了吗?
  • @cehnehdeh,听说过调试吗?
  • @user35443 是的!现在使用 VS 2013,但我不假设发布者可以访问调试器。
  • @cehnehdeh 你没有得到讽刺,你......
  • This post 解释它。

标签: c++ input io


【解决方案1】:

浮点异常通常发生在尝试进行非法算术运算时。 (检查this)在你的例子中,你最终会做模0,这是未定义的行为。大多数运行时都会出现某种运行时错误。 这是 gdb 在使用以下输入运行代码时给出的输出:

1 10

Program received signal SIGFPE, Arithmetic exception.
0x0000000000400920 in main () at a.cpp:21
21              if (n % (copy % 10) == 0)

尝试重塑您的算法,以免最终这样做。

(我建议学习调试工具并通过它们运行代码以发现此类问题)

关于为什么没有打印该行,那是因为 cin 和 cout 的大多数实现都是基于缓冲区的(阅读 this 了解更多关于缓冲 i/o 的信息)。如果您在 cout 之后添加了“std::endl”,您可能已经看到了输出。或者您可以使用 std::cerr 来输出调试信息。 std::cerr 有更严格的标准规定,以更勤奋地冲洗。在您的情况下,可以在刷新缓冲区之前终止应用程序。

【讨论】:

  • 好的,我明白了。但是为什么没有打印出来呢?该行出现在模数之前,所以它应该已经被执行了。
  • @user218750 更新了我的答案
【解决方案2】:

您不能 mod 除以 0。尝试重新设计您的算法,以避免尝试执行该操作。也许检查copy % 10 == 0 然后跳过那个案例。 this stack exchange post 中描述了它是 floating point exception 而不是 divide by zero exception 的原因

【讨论】:

  • 是的,但为什么是floating-point exception 而不是0x0 - divison by zero
  • @user35443 OP 实际上有一个 exception error,但不清楚他们实际得到了什么。
  • @user35443 bashrc 的响应显示了一个 SIGx。如果这不是您遇到 OP 的问题,请告诉我们。
  • 好的,谢谢。问题:为什么看起来是 cin 导致了问题?行 "cout
【解决方案3】:

当您输入任何否时,您的代码将正常工作。没有任何 0 数字。代码中的问题是您试图将数字除以 0。

       **if (n % (copy % 10) == 0)**

在这种情况下,当我们输入任何以 0 为数字的 no 时,(copy%10) 的值变为 0。因此它试图将 n 除以 0,从而引发浮点异常错误。 像这样更改您的代码:

声明一个名为'r'的新变量。当我们得到0作为数字时,这将阻止命令的执行。因此程序将运行得很好

while(copy!=0)
        {`enter code here`
            r=copy%10;
            if(r!=0)
            {
                if(n % r==0)
                count++;
            }
            copy=copy/10;
        }
        cout<<count<<endl;

【讨论】:

    【解决方案4】:

    你不能修改 0。检查以确保副本是非零的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 2012-09-30
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多