| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
同意楼上的思路,给出Java源码In Reply To:O(1)终于搞出来了.. Posted by:Viaxl at 2010-03-18 03:14:20 public class Main {
// 求数 n 的位数
public static int getWeiShu(int n)
{
int weiShu = 0;
while(n != 0)
{
n = n / 10;
weiShu++;
}
return weiShu;
}
public static int location(int i)
{
//i - 所求序数
//ans - 所求位的数字
//j - 递推定位串
//base - 记录每个串递增的位数
//sum - 记录串的总位数 、 用作计数
int ans;
int j = 1, base, sum = 1;
while(i >= sum)
{
i -= sum;
j++; //j 记载 下一个串 到哪个数字串了 -- 12...j
//将整个数字串中,每一个1...j视为一个单独处理的串
base = getWeiShu(j);
//该串比上一个串多的字符数 - j 的位数
sum += base; //该串的字符总数
}
//出口:定位到单独的串,此时有i >= 0
if( i == 0) //所求为该串最后一个数的最后一位
{
ans = (j -1) % 10;
return ans;
}
sum = 1; //从串(1...j) 中第一个数开始找
base = 1; //串中第一个数的位数是 1
while( i >= base) //求 1...j 串中第 i 个数字
{
i -= base;
sum++;
base = getWeiShu(sum); //sum 的位数
}
//出口:定位到串中的数,此时有i >= 0
if( i == 0) //所求为该数的最后一位
{
ans = (sum -1) % 10;
return ans;
}
j = getWeiShu(sum) - i;
while( j-- > 0) //ans is the ith number of (sum)
{
sum /= 10;
}
ans = sum % 10;
return ans;
}
public static void main(String[] args)
{
java.util.Scanner input = new java.util.Scanner(System.in);
int t = input.nextInt(); //test number
while(t-- > 0)
{
int i = input.nextInt();
System.out.println( location(i) );
}
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator