1087 1 10 100 1000

题目来源:  Ural 1209
基准时间限制:1 秒 空间限制:131072 KB 分值: 5  难度:1级算法题
 收藏
 关注
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"的分布:

位置123456789101112131415161718...
序列110100100010000100...

可以看出数字“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--;
	}

}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值