Команда printf не печатает при добавлении нового кода для поиска общих делителей. - PullRequest
0 голосов
/ 15 октября 2018

В колледже у меня было задание: взять в качестве входных данных два числа и использовать грубую силу, чтобы получить их отдельные делители, сохранить их в массивах и затем распечатать.После чего нас попросили получить их общие делители, используя сравнение между двумя массивами, и создать массив, который содержал общие делители, и затем распечатать их.

Код ниже работал просто отлично

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 голосов
/ 15 октября 2018

Вы печатаете common_div [u].Может быть, вы хотите напечатать common_div [i]?потому что массив по индексу u не имеет никакого значения.

printf("The common divisors are \n") ;  
for(i = 0; i < u ; i++){ 
printf("%d ", common_div[u]) ;
}
0 голосов
/ 15 октября 2018

Ваша программа демонстрирует неопределенное поведение .

Проблема здесь:

  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++;
    }
  }

Еще несколько подсказок:

  • заменить все имена переменных, такие как j, k и т. Д., На значимые имена, такие как nbdivisors1, nbdivisors2 и т. Д. Единственное исключение - i, которое часто используется в качестве индекса цикла.
  • Отступ Ваш код правильно
  • Узнайте, как использовать ваш отладчик.Это позволяет вам выполнять ваш код шаг за шагом и проверять содержимое переменных.Это экономит время.

Отказ от ответственности: во второй части может быть больше проблем

...