Мне нужна помощь с кодом, который проверяет, является ли двоичное число палиндромом. Предположим, что на входе 21 (10101). В функции я делаю это:
-копировать значение num1 в num2
-теперь число 1 равно 00010101, а число 2 равно 00010101.
-сдвинуть (вправо) бит num1, пока num1>0
-теперь num1: 00000000|10101000 и num2 00010101|00000000
-сдвинуть (влево) только на одну позицию бит num1
-теперь num1: 00000001|01010000 и num2: 00010101|00000000
-теперь, пока num1 != num2 я сравниваю бит и сдвигаю num1 влево и num2 вправо, каждый цикл.
-сравнительный пример:
00000001|01010000
00010101|00000000
|
V
1==1
следующий цикл сравнения 0==0
Итак, мой код следующий. И у меня проблема, потому что я не знаю, как остановить последнее время (пока с условием: num1!=num2 && flag==true). Очевидно, что условие, которое я пишу, не является правильным. Но я не знаю, как это сделать. В этом конкретном случае я хочу остановить его, если он проверит 5 цифр. Затем я хочу спросить, слишком ли сложно решение, которое я делаю, и есть ли другой способ решить проблему (ps: это нормально, что мне это сложно? Потому что я думал решить это, преобразовав десятичное число в двоичное вручную используя while (n>0) -> n%2, чем запоминать бит в массиве и выполнять простой алгоритм для массива, чтобы проверить обратное; но теперь я хочу повторить проблему, используя << и >> оператор ). Спасибо вам всем.
#include <iostream>
using namespace std;
int palindrome(unsigned short);
int main()
{
unsigned short num;
cout << "Inserisci un numero:\t";
cin >> num;
if (palindrome(num) == 1)
cout << "Palindrome" << endl;
else
cout << "Not palindrome" << endl;
cout << "\a";
return 0;
}
int palindrome(unsigned short num1)
{
unsigned short num2 = num1;
bool flag = true;
while (num1>0)
{
num1 >>= 1;
}
num1 <<= 1;
while ((num1 != num2) && (flag == true))
{
if ((num1 & 1) != (num2 & 1))
{
flag = false;
break;
}
num1 <<= 1;
num2 >>= 1;
}
return flag;
}
Предложенное вами решение кажется очень сложным.
Я бы предложил подход наивный, в котором вы просто повторяете биты один за другим, начиная с обоих концов целого числа.
Как только есть разница в этих битовых состояниях, можно сделать вывод, что это не палиндром.
Если достигается середина целого числа, то мы можем заключить, что это палиндром.
#include <stdio.h>
#include <stdbool.h>
bool
palindrome(unsigned short num)
{
int bit_count=8*(int)sizeof(num);
int half_bit_count=bit_count/2;
for(int i=0; i<half_bit_count; ++i)
{
bool low=(num&(1u<<i))!=0;
bool high=(num&(1u<<(bit_count-1-i)))!=0;
if (low!=high)
{
return false;
}
}
return true;
}
int
main(void)
{
unsigned short i1=0x00A0;
unsigned short i2=0x05A0;
unsigned short i3=0xA005;
unsigned short i4=0x005A;
printf("%hx --> %d\n", i1, palindrome(i1));
printf("%hx --> %d\n", i2, palindrome(i2));
printf("%hx --> %d\n", i3, palindrome(i3));
printf("%hx --> %d\n", i4, palindrome(i4));
return 0;
}
Я самоучка в С++, и я заканчиваю свое руководство по книге. Я знаю такое понятие, как ввод-вывод, если еще переключать список векторов массива ООП-класс перечисляемый указатель пространства имен указатели полиформизма наследование и алгоритм, такой как сортировка выбором, быстрая сортировка, поиск, рекурсия бинарного поиска и т. д. И я делаю упражнения, рекомендованные моей книгой, но слишком часто работаю медленно, и мой разум останавливается. Часто я не очень хорошо знаю, как начать более сложный проект. Это нормально?
Я программирую много лет. Это нормально
@Riccardo Когда вы программируете годами, вы сталкиваетесь со многими ситуациями. Затем каждый раз, когда проблема похожа на то, что вы уже делали, это звонит в колокольчик, и вы быстро находите решение не так уж и плохо, вдохновленное тем, что вы уже знаете. Но это не относится к программированию, это просто вопрос времени, какой бы ни была область.
Ok. Я попытаюсь. (Вопрос: как ты это делаешь так быстро? Я подумаю, что я тупой :0 )