[51nod]3410精妙数

小明正在研究趣味数学。如果一个正整数,它的二进制形式是个回文数,小明就会将它称为“精妙数”。如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;
}

先转化成二进制;
在判断回文就好了(没打回文的)

你这个输出好像不对

看我的STL版代码!

#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;
}