首页 > 试题广场 >

编程量* 难度*** 性能要求** (1秒)

[问答题]
编程量*   难度***   性能要求** (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);
  }
}//-----------------------------------

发表于 2018-05-07 20:37:06 回复(0)