小明正在研究趣味数学。如果一个正整数,它的二进制形式是个回文数,小明就会将它称为“精妙数”。如33,二进制形式为10001,则33是一个精妙数。
现在小明找到了T个数字,他想让你判断这些数是不是精妙数。是精妙数回答“Yes”,否则回答“No”。
输入格式
第一行输入一个数T,表示数字个数; 之后T行,每行输入一个数,表示每个数字。
输出格式
输出T行,每行一个字符串"Yes"或者"No",以空格隔开。
输入样例
3
44
33
22
输出样例
No
Yes
No
数据范围
对于100%的数据,1≤T≤100000,0≤每个数字≤10^9;
以下是我错误的代码(不造哪错了):
#include<iostream>
#pragma GCC optimize(2)
using namespace std;
inline int f(int a)
{
long long num=0,m=a,n[101],i=1;
while(m)
{
n[i]=m%2;
m/=2;
i++;
}
for(int j=i-1;j>=1;j--)
num=num*10+n[j];
return num;
}
inline int r(int n)
{
int t=n,num=0;
while(t)
{
num=num*10+t%10;
t/=10;
}
return num;
}
int main()
{
int t,n;
cin>>t;
int a[t+1];
for(int i=1;i<=t;i++)
cin>>a[i];
for(int i=1;i<=t;i++)
{
n=f(a[i]);
if(r(n)==n)
cout<<"Yes\n";
else
cout<<"No\n";
}
return 0;
}
#include <iostream>
using namespace std;
int f(int x)
{
int i=0,a[200]= {0};
while(x>0) //转二进制
{
a[i]=x%2;
x=x/2;
i++;
}
for(int j=0; j<i/2+1; j++) //判断是否回文
{
if(a[j]!=a[i-1-j])
return 0;
}
return 1;
}
int main()
{
int T=0;
cin>>T;
int* p=new int[T];
for(int i=0; i<T; i++)
cin>>p[i];
for(int i=0; i<T; i++)
{
if(f(p[i])==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
void main()
{
int n,i,j=0;
int a[1000];
cin>>n;
i=n;
while(i)
{
a[j]=i%2;
i/=2;
j++;
}
for(i=j-1;i>=0;i--)
cout<<a[i];
cout<<endl;
}
先转化成二进制;
在判断回文就好了(没打回文的)
你这个输出好像不对
#include <iostream>
#include <cstring>
#include <cstdio>
#include <bitset>
#include <algorithm>
#include <cmath>
//做题不要开“氧气”优化,否则当心“碳硫磷”、“氮氧碘磷”竞赛什么的爆零
using namespace std;
int T, n;
int main()
{
string str, srt;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
if(n <= 0) {
puts("No\n");
continue;
}
bitset <33> b(n);//多一位防超界
str = b.template to_string<char, char_traits<char>, allocator<char> >();//bitset to string
int len = str.length();
for(int i = 0; i < str.length(); )//delete the prefixes of '0'
{
if(str[i] == '1') break;
if(str[i] == '0') str.erase(0, 1);
}
srt = str;
reverse(str.begin(), str.end());
if(str == srt) puts("Yes\n");
else puts("No\n");
}
return 0;
}