Объяснение сбоя при n = 16

У меня возникли проблемы с выполнением моей домашней работы в C. Задача дана целым числом n, выведите все двоичные числа длиной n, которые не имеют 2 последовательных нулей в них, включая начальные нули, обратите внимание, что по крайней мере один из функций должен быть рекурсивным. Вот пример, если n равно 4, то двоичное число 10 обрабатывается как 0010 и, следовательно, не будет напечатано, поскольку оно имеет 2 ведущих нуля. Моя проблема в том, что мой код падает, если n = 16, и я не знаю, почему, хотя я сделал много отладок. Вот мой код, спасибо за любую помощь здесь.

void binaries_n_digits_no_00(int n)
{
 if(n < 0)
{  
   return;
}

  print_binaries_n_digits_no_00(0,n);
}

void print_binaries_n_digits_no_00(long int current_binary_index,int n)
{
 int num_of_leading_zeros;
 if((current_binary_index > (power(2,n) - 1)) || n == 0)
 {
   return;
 }

 num_of_leading_zeros = n - binary_num_length(current_binary_index);

 if((binary_not_contain_00(current_binary_index) == 1) && 
                  (num_of_leading_zeros == 1 || num_of_leading_zeros == 0)){

  if(current_binary_index == 0 && n == 1)
   {
      printf("\n0");
   }
   else if(num_of_leading_zeros == 1)
   {
     if(current_binary_index != 0)
     {
       printf("\n0");
       print_binary(current_binary_index);
     }
   }
   else{
       printf("\n");
       print_binary(current_binary_index);
   }
} 
 print_binaries_n_digits_no_00(current_binary_index+1,n);
}

int binary_not_contain_00(long int num)
{
  if(num/2 == 0)
  {
    return 1;
  }

 if(((num%2) == 0) && (((num/2) % 2) == 0))
  {
   return 0;
  }

  return binary_not_contain_00(num/2);
}

void print_binary(long int num)
{
  if(num > 1)
   {
     print_binary(num/2);
   }

   printf("%d",num%2);
}

int binary_num_length(long int num)
{
 if(num <= 1)
 {
    return 1;
 }
 else{
    return (1 + binary_num_length(num/2));
 }
}

long int power(int m, int n)
{
 if(n == 0)
 {
    return 1;
 }
 return m * power(m,n-1);
}

0 ответов

Другие вопросы по тегам