编程量* 难度*** 性能要求** (1秒)
有一个无穷数列,其通项表示为:
an=10n, n=0, 1, 2…
构成了1, 10, 100, 1000,…,把它连起来,就成了数串110100100010000…。
问题是如何知道这数串的第i位到底是 0还是1。有数学天才的人可能思考起来容易一些,但不要忘了,现在是做程序,不是做数学。请把数学结论用于编程吧!
数据存放在 string01.txt 中, 文件一上来的第一个数占一行, 是正整数 N(N<65536=, 表明后面有 N个正整数呢。 后面 N个正整数 ki(i=1,2,3,...,N)都符合1≤ki≤231。
输出每个0或者1的时候,都要空一格,以便区分。样本输入文件的内容和输出结果示例于下:

//----------------------------------- //EX0602_1.cpp //01串的判位 //----------------------------------- #include<iostream> #include<fstream> using namespace std; //----------------------------------- bool judge(int n){ int k=1; for(int i=0; k<m; i++, k+=i); return k==m; }//---------------------------------- int main() { ifstream cin("string01.txt"); int n,a; for(cin>>n; n-- && cin>>a; ) cout<<judge(a)<<"\n"; }//----------------------------------//----------------------------------- //EX0602_2.cpp //01串的判位(二分搜索法) //----------------------------------- #include<stdio.h> #include<algorithm> // for binary search() //----------------------------------- int a[65536]= {1,2,4,7,11}; //----------------------------------- int main() { for(int i=5; i<65536; i++) a[i] = a[i-1] + i freopen("string01.txt","r",stdin); int n; scanf("%d", &n); for(int w; n-- && scanf("%d ",&w); ) printf("%d\n", std::binary_search(a, a+65536, w)); }//----------------------------------//----------------------------------- //EX0602_3.cpp //01串的判位 //----------------------------------- #include<stdio.h> #include<math.h> // for sqrt() //----------------------------------- int main() { freopen("string01.txt","r",stdin); int n; scanf("%d", &n); for(int w; n-- && scanf("%d ",&w); ) { double x = sqrt(8.0*w-7.0); printf("%d\n", x==(int)x); } }//-----------------------------------