//输入一个数,判断0~这个数之间的数的二进制序列数回文串的数的个数 //回文串是无论正着读还是反着读都一样的字符串,比如"level"或者"noon"就是 //回文串。若将某个十进制的非负整数N,转

题目:输入一个数,判断0~这个数之间的数的二进制序列数回文串的数的个数回文串是无论正着读还是反着读都一样的字符串,比如"level"或者"noon"就是回文串。若将某个十进制的非负整数N,转换成二进制后得到的01序列具有回文的性质,则称该数为回文数,比如9的二进制是1001,“1001”就是具有回文串的性质则称9是回文数。先给一个十进制数N,请计算小于等于N的回文数的数量。

分析:先得出一个整数的二进制串(不包含前面的0),然后判断该串是不是回文串,然后统计小于N的符合这样的数的个数

//判断一个串是否为回文串
bool is_reback(const string& s)
{
	int len = s.size();
	int begin = 0;
	int end = len - 1;
	while (begin <= end)
	{
		if (s[begin] == s[end])
		{
			begin++;
			end--;
		}
		else
		{
			return false;
		}
	}
	return true;
}

//求一个整数的二进制串
string str(unsigned long long n)
{
	string ret;
	int c = 64;
	//求出二进制串
	while (c)
	{
		int bit = (n & 1);
		char b = bit + '0';
		ret += b;
		n = n >> 1;
		c--;
	}
	int x = ret.rfind('1');
	string ret1 = ret.substr(0, x+1);
	//ret1是完整串
	return ret1;
}


void reback_count()
{
	unsigned long long n = 0  ;
	cin >> n;
	int c1 = 0;
	for (unsigned long long i = 0; i <= n; i++)
	{
		if (is_reback(str(i)))
		{
			c1++;
		}
	}
	cout << c1 << endl;
}
 
 
 

猜你喜欢

转载自blog.csdn.net/lyl194458/article/details/89257251