C++ C++;cin可以';不读入0的整数

C++ C++;cin可以';不读入0的整数,c++,input,io,C++,Input,Io,我在hackerrank上,遇到了一个非常奇怪的问题。问题是“给你一个整数N。找到这个数字中正好除以N的数字(除法留下0作为余数)并显示它们的计数。对于N=24,有两个数字(2和4)。这两个数字正好除以24。所以我们的答案是2。”。以下是我的解决方案: #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm>

我在hackerrank上,遇到了一个非常奇怪的问题。问题是“给你一个整数N。找到这个数字中正好除以N的数字(除法留下0作为余数)并显示它们的计数。对于N=24,有两个数字(2和4)。这两个数字正好除以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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
/*在此处输入代码。从标准输入读取输入。将输出打印到标准输出*/
int t,计数;
cin>>t;
for(int i=0;i不能修改被0除。请尝试重新设计算法,以避免尝试执行该操作。也许可以选中
copy%10==0
,然后跳过该情况。这是一个
浮点异常而不是
被0除异常的原因在中描述,您不能修改被0除。尝试重新设计您的算法,以避免尝试执行该操作。可能检查
复制%10==0
,然后跳过该情况。原因是
浮点异常
而不是
除零异常
,请参见中的说明。您不能将某些内容修改为0。请检查以确保复制为非Zero。

您不能用0修改某些内容。请检查以确保副本为非零。

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

110

尝试重新构建你的算法,这样你就不会这样做了

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


关于为什么没有打印行,这是因为cin和cout的大多数实现都是基于缓冲区的(阅读更多关于缓冲i/o的内容)之后,您可能会看到输出。或者您可能会使用std::cerr输出调试信息。std::cerr标准规定了更严格的要求,以更勤奋地刷新。在您的情况下,在刷新缓冲区之前,应用程序会终止。

在尝试执行此操作时,通常会发生浮点异常一个非法的算术运算。(检查)在您的示例中,您将执行模0,这是一种未定义的行为。大多数运行时都会出现某种运行时错误。 以下是gdb在使用以下输入运行代码时给出的输出:

110

尝试重新构建你的算法,这样你就不会这样做了

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


关于为什么没有打印行,这是因为cin和cout的大多数实现都是基于缓冲区的(阅读更多关于缓冲i/o的内容)之后,您可以看到输出的到来。或者您可以使用std::cerr输出调试信息。std::cerr有更严格的标准要求,可以更勤奋地刷新。在您的情况下,在刷新缓冲区之前,应用程序会终止。

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

       **if (n % (copy % 10) == 0)**
在这种情况下,当我们以0作为数字输入任何no时,(副本%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;
while(复制!=0)
{`在这里输入代码`
r=副本%10;
如果(r!=0)
{
如果(n%r==0)
计数++;
}
复制=复制/10;
}

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

       **if (n % (copy % 10) == 0)**
在这种情况下,当我们以0作为数字输入任何no时,(副本%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;
while(复制!=0)
{`在这里输入代码`
r=副本%10;
如果(r!=0)
{
如果(n%r==0)
计数++;
}
复制=复制/10;
}

coutTry在使用它之前打印出n,你得到你的输入了吗?@cehnehdeh,听说过调试吗?@user35443是的!现在正在使用VS 2013,但我不认为海报可以访问调试器。@cehnehdeh你没有得到讽刺,是不是…解释过。在使用它之前尝试打印出n,你得到你的输入了吗?@cehnehdeh,听说过debugging?@user35443是的!现在正在使用VS 2013,但我不认为海报可以访问调试器。@cehnehdeh你没有得到讽刺,是吗……解释了。是的,但是为什么
浮点异常
上升,而不是
0x0-零除法
?请看@user35443,OP实际上有一个
异常错误
不清楚他们到底得到了什么。@user35443 bashrc的回答显示了一个SIGx。如果这不是OP的问题,那么请让我们知道。好的,谢谢。问题:为什么cin似乎是导致问题的原因“是的,但是为什么
浮点异常
上升而不是
0x0-零除法
?请看@user35443,OP实际上有一个
异常错误
,这对wh来说是不清楚的