添加新代码以查找公共除数时,Printf命令不打印。

时间:2018-10-15 06:54:09

标签: c++ loops greatest-common-divisor

我在大学里有一个作业,要输入两个数字,并用蛮力获得它们的各个除数,将它们存储在数组中,然后打印出来。接下来,我们被要求使用两个数组之间的比较来获得它们的公共除数,然后创建一个包含公共除数的数组,然后打印它们。

下面的代码很好用

int main() {
int n1, n2, i, j, n, k, l, m, u, h, test ;
int divisors1[100] ;
int divisors2[100] ;
int common_div[100] ;
int up_limit, low_limit ;

printf("Enter an integer") ;
scanf("%d", &n1) ;
printf("Enter an integer") ;
scanf("%d", &n2) ;

for(i = 1, j = 0, k = 0; i <= n ; i++){
if(n1 % i == 0){
    divisors1[j] = i ;
    j++ ;
}
if(n2 % i == 0){
    divisors2[k] = i ;
    k++ ;
}
}
// printf("The divisors of %d are ", n1);
for(l = 0 ; l < j ; l++){
 printf("%d ", divisors1[l]) ;
}
printf("\n") ;
// printf("The divisors of %d are ", n2) ;
for(l = 0; l < k ; l++){
printf("%d ", divisors2[l]) ;
}
}

但是,在我添加了这个新的报价块之后,似乎没有任何代码有效。上一个和下一个都不是。我在代码第一部分的末尾添加了代码。

up_limit = 0 ;
low_limit = 0 ;
if(j > k){
up_limit = j ;
low_limit = k ; 
}else{
up_limit = k ;
low_limit = j ;
}

if(up_limit == j){
for(m = 0; m < up_limit ; m++){
test = divisors1[m] ;
for(h = 0, u = 0 ; h < low_limit; h++){
    printf("%d", divisors2[h]) ;
    if(test == divisors2[h]){       
        common_div[u] = divisors2[h] ;
    u++ ;
    }   
}
}
}else{
 for(m = 0; m < up_limit ; m++){
test = divisors2[m] ;
for(h = 0, u = 0 ; h < low_limit; h++){
    printf("%d", divisors1[h]) ;
    if(test == divisors1[h]){   
        common_div[u] = divisors2[h] ;
    u++ ;
    }   
}
}

}
printf("The common divisors are \n") ;  
for(i = 0; i < u ; i++){ 
printf("%d ", common_div[u]) ;
}

我的主要问题是为什么在这种情况下printf会不正常地工作。 这是我添加代码

之后的示例输出
Enter an integer 345
Enter an integer345

The common divisors are 

2 个答案:

答案 0 :(得分:0)

您的节目展示了undefined behaviour

问题在这里:

  for (i = 1, j = 0, k = 0; i <= n; i++) {
    if (n1 % i == 0) {
    ...

变量n从未被初始化(IOW,您从未在其中添加任何内容),因此它包含一个不确定的值。如果程序可以运行,那完全是巧合。

除非您不解决此问题,否则一旦添加附加代码,调查该程序为何不再起作用是毫无意义的。

您的程序可能的解决方法是:

替换此部分:

for(i = 1, j = 0, k = 0; i <= n ; i++){
if(n1 % i == 0){
    divisors1[j] = i ;
    j++ ;
}
if(n2 % i == 0){
    divisors2[k] = i ;
    k++ ;
}
}

与此:

  for (i = 1, j = 0; i <= n1; i++) {
    if (n1 % i == 0) {
      divisors1[j] = i;
      j++;
    }
  }

  for (i = 1, k = 0; i <= n2; i++) {
    if (n2 % i == 0) {
      divisors2[k] = i;
      k++;
    }
  }

更多提示:

  • 将所有变量名(例如jk等替换为有意义的名称,例如nbdivisors1nbdivisors2等)。i是一个例外,它是通常用作循环索引。
  • indent正确输入您的代码
  • 学习如何使用调试器。这使您可以逐步执行代码并检查变量的内容。这可以节省大量时间。

免责声明:第二部分可能还有更多问题

答案 1 :(得分:-1)

您正在打印common_div [u]。也许您想打印common_div [i]?因为索引u处的数组没有任何值。

printf("The common divisors are \n") ;  
for(i = 0; i < u ; i++){ 
printf("%d ", common_div[u]) ;
}