51nod 1087 1 10 100 1000
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000) 第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)
共T行,如果该位是0,输出0,如果该位是1,输出1。
3 1 2 3
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;
}
}}

浙公网安备 33010602011771号