我正在编写一个代码,其中输入运行一些测试用例,并且在每个测试用例中我们必须迭代每个数字的数字,我们必须将其除以初始数字,如果给出其余0然后我们需要递增计数,否则我们不需要递增计数,最后我们将打印计数。
数字12分为两个数字,1和2.当12分割时 通过这些数字中的任何一个,计算的余数为0;就这样 12中可均分的数字是2
编译器消息
浮点例外
下面给出了代码,当在c编译器中运行时,程序在输入后突然停止。
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
int main(){
int t;
int n[t],b,rem;
int count =0;
scanf("%d",&t);
for(int a0 = 0; a0 < t; a0++){
scanf("%d",&n[a0]);
}
for(int i=0;i<t;i++){
b =n[i];
while (n[i]) {
rem = n[i] % 10;
if(b%rem == 0)
count++;
n[i] = n[i] / 10;
}
printf("%d\n",count);
}
return 0;
}
答案 0 :(得分:2)
在您的代码中,在您撰写int n[t]
时,t
未初始化。由于单位化自动局部变量的初始值是不确定的并且使用它调用undefined behavior,因此您的代码显示UB。
之后,从int n[t]
运算符的属性引用t
,章节§6.5.6,( emphais mine )
%
运算符的结果是第一个操作数除以的商 第二;C11
运算符的结果是余数。 在两个操作中,如果值为 第二个操作数为零,行为未定义。
因此,您需要确保/
在执行%
时不是rem
。您应该检查0
以避免出现这种情况。
这就是说,只是一个建议:VLA不再是标准C的强制部分(if(b%rem == 0)
以上),因此您可以使用指针并使用malloc()
和系列分配动态内存。
答案 1 :(得分:2)
您可以在设置大小之前创建给定大小的数组。 另一个错误(逻辑1)是您没有为每个数字重置计数器。 你最初的问题是,你没有注意除以0。 这可能是一个解决方案:
int main(){
int t;
scanf("%d",&t);
int n[t];
for (int a0=0; a0<t; a0++){
scanf("%d",&n[a0]);
}
for (int i=0; i<t; i++){
int count = 0;
int b=n[i];
while (n[i]) {
int rem = n[i] % 10;
if (rem!=0 && b%rem==0)
count++;
n[i] = n[i] / 10;
}
printf("%d\n",count);
}
return 0;
}