POJ 1019 Number Sequence【数论】

Description

A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...Sk. Each group Sk consists of a sequence of positive integer numbers ranging from 1 to k, written one after another. 
For example, the first 80 digits of the sequence are as follows: 
11212312341234512345612345671234567812345678912345678910123456789101112345678910

Input

The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by one line for each test case. The line for a test case contains the single integer i (1 ≤ i ≤ 2147483647)

Output

There should be one output line per test case containing the digit located in the position i.

Sample Input

2
8
3

Sample Output

2
2

题目大意:比较容易理解就是找出第i位的数字是多少;
思路:

很容易看出题目给的规律,1 112 112123 1121231234 112123123412345....题目给出第i位的数字,i的范围恰好是int的范围,可以算出不会超过40000组;
用a[i]表示i组数的位数:a[i]=a[i-1]+(int)(log10(i*1.0))+1; num[i]表示前i组数的位数和num[i]=num[i-1]+a[[i];
举例:假若求54321的第2位的数字,即54321/(pow(10, 5-2))%10;即将多余的位数去掉:n/(pow(10, 多余位数),在对10取模得打结果;

关于精度问题解题思路没有精确说明;

代码如下:

View Code
#include<stdio.h>
#include<string.h>
#include<math.h> 
long long a[40005], num[40005]; 
int main()
{
    int T, i;
    long long n; 
    scanf("%d", &T);
    memset(a, 0, sizeof(a));
    memset(num, 0, sizeof(num)); 
    for(i=1; i<=40000; i++)
    {
        a[i]=(long long)(log10(i*1.0))+1+a[i-1];
        num[i]=num[i-1]+a[i];
    }
    while(T--)
    {
        scanf("%lld", &n);
        for(i=0; i<40000; i++)
            if(n>num[i]&&n<=num[i+1])
                break; 
        int pos=n-num[i];
        int length=0;
        for(i=1; length<pos; i++)
            length+=(int)(log10(i*1.0))+1; 
        int mod=(i-1)/((int)(pow(10.0, length-pos)))%10;
        printf("%d\n", mod); 
    }
}

转载于:https://www.cnblogs.com/Hilda/archive/2012/08/17/2644739.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值