您的位置:首页 > 其它

HDOJ1597 find the nth digit(二分)

2015-08-02 19:31 1051 查看
Problem Description

假设:

S1 = 1

S2 = 12

S3 = 123

S4 = 1234

.........

S9 = 123456789

S10 = 1234567891

S11 = 12345678912

............

S18 = 123456789123456789

..................

现在我们把所有的串连接起来

S = 1121231234.......123456789123456789112345678912.........

那么你能告诉我在S串中的第N个数字是多少吗?



Input

输入首先是一个数字K,代表有K次询问。

接下来的K行每行有一个整数N(1 <= N < 2^31)。



Output

对于每个N,输出S中第N个对应的数字.



Sample Input

6
1
2
3
4
5
10




Sample Output

1
1
2
1
2
4


AC代码:

1.二分

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cstdlib"
using namespace std;
typedef long long ll;
ll n, w, a[66666];
void search(int l, int r)
{
	int m = (l + r) / 2;
	if(a[m] < n && a[m + 1] >= n) {
		w = m;
		return ;
	}
	if(a[m] >= n) search(l, m - 1);
	if(a[m + 1] < n) search(m + 1, r);
}
int main(int argc, char const *argv[])
{
	int t, ans;
	for(int i = 1; i <= 66000; ++i)
		a[i] = a[i - 1] + i;
	cin >> t;
	while(t--) {
		cin >> n;
		w = -1;
		search(1, 65536);
		ans = n - a[w];
		ans %= 9;
		if(!ans) ans = 9;
		cout << ans << endl;
	}
	return 0;
}


2.脑洞

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cstdlib"
using namespace std;
typedef long long ll;
int main(int argc, char const *argv[])
{
	int t, n;
	cin >> t;
	while(t--) {
		cin >> n;
		int a = 1;
		while(n > a) {
			n -= a;
			a++;
		}
		n %= 9;
		if(!n) n = 9;
		cout << n << endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: