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 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | ... |
序列 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | ... |
可以看出数字“1”的位置是:1,2,4,7,11,16......
即1,1+1,1+1+2,1+1+2+3,1+1+2+3+4,1+1+2+3+4+5....
即只要S满足S-1=n*(n+1)/2(n为整数),则位置S的值为1。
伪代码:
N=S-1;
(-1 + sqrt((double)(1 + 8 * N))) / 2 == (int)((-1 + sqrt((double)(1 + 8 * N))) / 2) //(C语言);
或
(-1+Math.sqrt(1+8*N))/2==(int)(-1+Math.sqrt(1+8*N))/2) //(java);
下面上代码:
java:(1546ms)
import java.util.Scanner;
public class Main {
public static void main(String Arg[]) {
Scanner cin = new Scanner(System.in);
int T = cin.nextInt();
while (T>0)
{
int N = cin.nextInt()-1;
if ((-1+Math.sqrt(1+8*N))/2==(int)(-1+Math.sqrt(1+8*N))/2){
System.out.println(1);
}else System.out.println(0);
T--;
}
}
}
C语言:(15ms)
#include<stdio.h>
#include "math.h"
void main(){
int T,S,N;
scanf("%d", &T);
while (T > 0){
scanf("%d", &S);
N = S - 1;
if ((-1 + sqrt((double)(1 + 8*N))) / 2 == (int)((-1 + sqrt((double)(1 + 8*N))) / 2))
printf("1\n");
else
{
printf("0\n");
}
T--;
}
}