zoukankan      html  css  js  c++  java
  • 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); 
        }
    }
  • 相关阅读:
    C#多线程之Parallel中 类似于for的continue,break的方法
    C#中静态类、静态方法和静态变量的简单说明
    C# 类属性封装、字段的详解
    BackgroundWorker 后台进程控制窗体label、richtextbook内容刷新
    asp.net 实现 tts
    System.Speech.Synthesis 添加暂停、继续功能
    微软TTS,Neospeech TTS 简单使用
    VS2015如何批量统改相同变量名
    VS2015时显示无法启动此程序 因为计算机中丢失ucrtbased.dll
    Windows环境下MinGW/gcc安装和环境配置
  • 原文地址:https://www.cnblogs.com/Hilda/p/2644739.html
Copyright © 2011-2022 走看看