Определить, является ли периодической последовательностью двоичная запись заданного натурального числа - 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();
Объяснение кода листинга программы
- В функции toBynar(), двоичное представление числа val переводится в обратный порядок в массиве *massiv.
- В функции proverka(), проверяется, является ли двоичная последовательность в массиве a периодической.
- В функции main(), считывается натуральное число x, затем определяется его двоичное представление в массиве a с помощью функции toBynar().
- Длина двоичной последовательности в массиве a сохраняется в переменную k.
- В цикле for выводятся все элементы массива a.
- В цикле for проверяется, является ли двоичная последовательность в массиве a периодической с помощью функции proverka().
- Если условие (d[0]==1)&&(proverka(k,a)==1)) выполняется, то c=1.
- В цикле for выводится двоичное представление числа c.