为什么要迭代一个数字中的每个数字并找到均匀分割的数字不起作用?

时间:2016-04-21 17:32:39

标签: c arrays loops if-statement

我正在编写一个代码,其中输入运行一些测试用例,并且在每个测试用例中我们必须迭代每个数字的数字,我们必须将其除以初始数字,如果给出其余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;
}

2 个答案:

答案 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;
}