int n, i, m1=0x80000000, m2=0x1;
bool test=true;
printf("vvedite chislo\n");
scanf("%d", &n);
for(i=0;i<16;i++)
{
if((n&m1) != (n&m2))
{
test=false;
break;
}
m1>>=1;m2<<=1;
}
if (test==false)
printf("ne simmetrichno\n");
else
printf("simmetrichno\n");
#include <stdio.h>
int n, i, m1=0x8000, m2=0x1;
bool test=true;
void main(void)
{
printf("vvedite chislo\n");
scanf("%d", n);
for(i=0;i<8;i++)
{
if(n&m1 != n&m1)
{
break;
test=false;
}
m1>>=1;m2<<=1;
}
if (test=false)
printf("ne simmetrichno\n");
else
printf("simmetrichno\n");
}
--- t.c 2010-11-08 13:01:23.000000000 +0300
+++ t1.c 2010-11-08 17:45:26.000000000 +0300
@@ -21,18 +21,14 @@
/*считаем, что число дополнено слева нулями до требуемой длины
Если нужно проверять симметричность в пределах ёмкости типа (32 bit, 64 bit и т.д.), то 2 следующих цикла нужно убрать
*/
- /*отбрасываем нули слева и справа
+ /*отбрасываем нули слева
*/
while(m>0)
{
if(((a >> m) & 1) != 0)break;
--m;
};
- while(l<bits)
- {
- if(((a >> l) & 1) != 0)break;
- ++l;
- };
+
/*сравниваем биты, двигаясь одновременно вниз от msb и вверх от lsb*/
while(m>l)
{
/*
* File: main.cpp
* Author: Micren
*
* Created on 9 Ноябрь 2010 г., 17:44
*/
#include <limits>
#include <iostream>
using namespace std;
typedef unsigned int data_t;
/*
*
*/
// true если симметричное
bool isSymmetric(data_t value);
// В строку
string toBinaryString(data_t value);
int main()
{
while (true)
{
// Ввод числа
cout << "Введите целое положительное число:";
data_t val;
cin >> val;
if (cin.fail())
{
if (cin.eof())
{
break;
}
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Ошибочный ввод" << endl;
continue;
}
cout << "Число " << val << '(' << toBinaryString(val) << ") " << (isSymmetric(val) ? "" : "не ") << "симметричное" << endl;
}
return 0;
}
bool isSymmetric(data_t value)
{
data_t tmp = value, mirror = 0;
while (tmp)
{
mirror = (mirror << 1) | (tmp & 1);
tmp >>= 1;
}
return value == mirror;
}
string toBinaryString(data_t value)
{
string result;
do
{
result = "01"[value & 1] + result;
value >>= 1;
}
while (value);
return result;
}
Введите целое положительное число:1
Число 1(1) симметричное
Введите целое положительное число:2
Число 2(10) не симметричное
Введите целое положительное число:-1
Число 4294967295(11111111111111111111111111111111) симметричное
Введите целое положительное число:101
Число 101(1100101) не симметричное
Введите целое положительное число:5
Число 5(101) симметричное
/*
* File: main.cpp
* Author: Micren
*
* Created on 9 Ноябрь 2010 г., 17:44
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
typedef unsigned int data_t;
#define DATA_BITS (sizeof (data_t) << 3)
/*
*
*/
// true если симметричное
bool isSymmetric(data_t value);
// Печать в двоичном виде
void printBinary(data_t value);
int main()
{
data_t val;
while (true)
{
// Ввод числа
printf("Введите целое положительное число:");
int ret = scanf("%u", &val);
if (ret != 1)
{
if (feof(stdin))
{
break;
}
printf("Ошибочный ввод\n");
return EXIT_FAILURE;
}
printf("Число %u(", val);
printBinary(val);
printf(") %s симметричное\n", isSymmetric(val) ? "" : "не");
}
return EXIT_SUCCESS;
}
bool isSymmetric(data_t value)
{
data_t tmp = value, mirror = 0;
while (tmp)
{
mirror = (mirror << 1) | (tmp & 1);
tmp >>= 1;
}
return value == mirror;
}
void printBinary(data_t value)
{
char buffer[DATA_BITS + 1] = {0}, *ptr = buffer + DATA_BITS;
do
{
*--ptr = "01"[value & 1];
value >>= 1;
}
while (value);
printf("%s", ptr);
}
l=0;
--- t.c~ 2010-11-10 09:20:05.000000000 +0300
+++ t.c 2010-11-10 09:21:21.000000000 +0300
@@ -17,22 +17,17 @@
printf("%d",(a>>(l--))&1);
};
printf("\n");
-
- /*считаем, что число дополнено слева нулями до требуемой длины
- Если нужно проверять симметричность в пределах ёмкости типа (32 bit, 64 bit и т.д.), то 2 следующих цикла нужно убрать
+ l=0;
+ /*
+ Если нужно проверять симметричность в пределах ёмкости типа (32 bit, 64 bit и т.д.), то следующий цикл нужно убрать
*/
- /*отбрасываем нули слева и справа
+ /*отбрасываем нули слева
*/
while(m>0)
{
if(((a >> m) & 1) != 0)break;
--m;
};
- while(l<bits)
- {
- if(((a >> l) & 1) != 0)break;
- ++l;
- };
/*сравниваем биты, двигаясь одновременно вниз от msb и вверх от lsb*/
while(m>l)
{
$ ./t
5
00000000000000000000000000000101
Yes
$ ./t
4294868991
11111111111111100111111111111111
Yes
$ ./t
4294721535
11111111111111000011111111111111
Yes
$ ./t
34
00000000000000000000000000100010
No
- while(l<bits)
- {
- if(((a >> l) & 1) != 0)break;
- ++l;
- };
#include <stdio.h>
int main()
{
/*можно подставить другой тип (в том числе свой собственный, определив требуемые операторы: ">>","&","!=")
Собственный тип только в виде структуры/массива фиксированной длины, иначе sizeof не будет работать правильно. Не класс!
например typedef unsigned mytype[10];
*/
unsigned a=0;
int m=0,l=0,bits;
/*если поменять тип на unsigned long long, то формат будет %Lu, для других типов тоже поменять соответственно*/
scanf("%u",&a);
bits=l=m=sizeof(a)*8-1;
/*Выведем число для проверки в двоичном виде*/
while(l>=0)
{
printf("%d",(a>>(l--))&1);
};
printf("\n");
l=0;
/*
Если нужно проверять симметричность в пределах ёмкости типа (32 bit, 64 bit и т.д.), то следующий цикл нужно убрать
*/
/*отбрасываем нули слева
*/
while(m>0)
{
if(((a >> m) & 1) != 0)break;
--m;
};
/*сравниваем биты, двигаясь одновременно вниз от msb и вверх от lsb*/
while(m>l)
{
if( ((a >> m) & 1) != ((a >> l) & 1) )
{
/*не совпали*/
printf("No\n");
return 0;
};
--m;
++l;
};
/*все совпали*/
printf("Yes\n");
return 0;
}
$ gcc -o t t.c
$ ./t
34
00000000000000000000000000100010
No
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.