51nod 1087 1 10 100 1000

1,10,100,1000...组成序列1101001000...,求这个序列的第N位是0还是1。
 
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)
Output
共T行,如果该位是0,输出0,如果该位是1,输出1。
Input示例
3
1
2
3
Output示例
1
1
0
题解:
此题需要认真分析,位置与1的关系,
/**
 *注意在如果将第二位看做第一位那么k*(k+1)/2的位都是1,k>=1,其他位都是0
 *即如果n-1=k*(k+1)/2  (n>1),则该位就是1,
 */


#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int T;
    cin>>T;
    int k;
   while(T--)
    {  cin>>k;
    if(k==1)
       {cout<<"1"<<endl;continue;}
      int h=sqrt(2*(k-1));
      for(int i=h;;i++)
      {if(2*(k-1)==i*(i+1))
          {cout<<"1"<<endl;break;}
       if(2*(k-1)<i*(i+1))
         {cout<<"0"<<endl;break;}
      }
       
      }

}

附上第一遍自己想的:(但是超时了)

#include<iostream>
using namespace std;
int a[10010];
int main()
{
    int T;
    cin>>T;
    for(int i=0;i<T;i++)
         cin>>a[i];
    for(int i=0;i<T;i++)
    {  int k=a[i];
     if(k==1||k==2)
         cout<<"1"<<endl;
      else
      { k=2*(k-1);
        bool flag=true;
        for(int i=1;i<=k/4;i++)
         {
   if(k==i*(i+1))
              { flag=false;
                 break;
     }
         }
         if(flag)
             cout<<"0"<<endl;
         else
            cout<<"1"<<endl;
      }

}}

posted @ 2018-02-21 20:00  kong孔  Views(130)  Comments(0)    收藏  举报