Определить, является ли периодической последовательностью двоичная запись заданного натурального числа - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Уважаемые! Прошу вас помочь с алгоритмом, так как сам к сожалению ничего придумать не могу.

Условие задачи:

Определить, является ли периодической последовательностью двоичная запись заданного натурального числа N, т.е. имеет ли она вид xx...x, где x - некоторая непустая послед-ть.

Решение задачи: «Определить, является ли периодической последовательностью двоичная запись заданного натурального числа»

textual
Листинг программы
#include <conio.h>
#include <stdio.h>
 
int toBynar(int val, int *massiv)
{
    int *a = massiv;
    int koll = 1;
    do
    {
        *massiv = val % 2;
        val = val / 2;
        massiv++;
        koll++;
    } while (val >= 2);
    *massiv = val;
    //----------------------------------------  
    for (; a < massiv; a++, massiv--)
    {
        val = *a;
        *a = *massiv;
        *massiv = val;
    }
    return koll;
}
 
int proverka(int k,int *a)
{   int c;
    for(int p=0;p<k;p++)
                {
                    if(a[p]==1) c=1;
                    else c=0;      
                    if (c==0) break;
                }
    return c;      
}
 
 
 
    
void main(){
    int x,i,a[n],d[n],b=0,k=0,c=0,p=0,m=0;
    scanf("%d", &x);
    int t = toBynar(x,a);
    for (i=0;i<t;i++){
    printf("%d",a[i]);
    k++;
    }
    printf("\n%d",k);
    for (m=1;m<k;m++){
      if (k%m==0 ){ 
                  d[b]=m;
                  printf("\n%d",d[b]); 
                  b++;
      }
    }
     
    
 
    if ((d[0]==1)&&(proverka(k,a)==1))c=1;
    if (c==0)
    {                           
        for (b=1;b<=k;b++)
        {                                 
            for (p=0;p<=k-b;p++)
            {
                if (a[p]==a[p+d[b]]) c=1;
                else 
                    {
                        c=0;
                        break;
                    }
            }
            if(c==1)break;
        }
    }
    
    
    printf("\n\n\n\n%d",c);
        _getch();

Объяснение кода листинга программы

  1. В функции toBynar(), двоичное представление числа val переводится в обратный порядок в массиве *massiv.
  2. В функции proverka(), проверяется, является ли двоичная последовательность в массиве a периодической.
  3. В функции main(), считывается натуральное число x, затем определяется его двоичное представление в массиве a с помощью функции toBynar().
  4. Длина двоичной последовательности в массиве a сохраняется в переменную k.
  5. В цикле for выводятся все элементы массива a.
  6. В цикле for проверяется, является ли двоичная последовательность в массиве a периодической с помощью функции proverka().
  7. Если условие (d[0]==1)&&(proverka(k,a)==1)) выполняется, то c=1.
  8. В цикле for выводится двоичное представление числа c.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы