【发布时间】:2019-07-20 09:06:24
【问题描述】:
我需要有关检查二进制数是否为回文的代码的帮助。假设输入是 21 (10101)。在函数中我这样做:
-将num1的值复制到num2
-现在 num1 是 00010101 而 num2 是 00010101
-shift(right) num1 的位,而 num1>0
-现在 num1 是:00000000|10101000 而 num2 是 00010101|00000000
-将num1的位(左)移一位
-现在 num1 是:00000001|01010000 而 num2 是 00010101|00000000
-现在 while num1 != num2 我比较位并将 num1 左移和 num2 右移,每个循环。
-比较示例:
00000001|01010000
00010101|00000000
|
V
1==1
下一个循环比较是 0==0
所以我的代码如下。我有一个问题,因为我不知道如何停止最后一段时间(while 条件: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;
}
【问题讨论】:
标签: c++ palindrome shift