• POJ 1019 Number Sequence(组合数学)


    Number Sequence

    大意:给一个有规律的序列,给你一个n,求第n位的数字是多少。

    最开始理解错了,理解成第n个数字是多少了,应该是第n位是多少,WA了好几遍,看了Discuss中第2147483647位答案是2,才知道是怎么回事的= =、

    思路:数字的位数可以用 log10((double)i) + 1 这个公式求出来,这样逐步求精就可以慢慢地求出结果了。

     1 # include <map>
     2 # include <queue>
     3 # include <stack>
     4 # include <math.h>
     5 # include <stdio.h>
     6 # include <string.h>
     7 # include <iostream>
     8 # include <algorithm>
     9 using namespace std;
    10 
    11 long long a[35000], sum[35000];
    12 void init()      ///打表
    13 {
    14     a[1] = 1;
    15     sum[1] = 1;
    16     for(int i = 2; i < 31270; i++)
    17     {
    18         ///每一组数字都比上一组长 (int)log10((double)i) + 1
    19         a[i] = a[i-1] + (long long)log10((double)i) + 1;
    20         sum[i] = sum[i-1]+a[i];
    21     }
    22 }
    23 
    24 void run()
    25 {
    26     long long m, n;
    27     init();
    28     scanf("%lld", &n);
    29     while(n--)
    30     {
    31         scanf("%lld", &m);
    32         int len = 0;
    33         int i = 1;
    34         while(sum[i] < m)   ///找到 n 所在的组
    35             i++;
    36         int pos = m-sum[i-1];  ///找到 n 在该组的下标
    37         for(i = 1; len < pos; i++)      
    38         {
    39             ///len: n指向的数字的最后一位的下标
    40             len += (int)log10((double)i)+1;
    41         }
    42         ///去掉所求位后面的数字然后取余         i: n指向的数字 + 1
    43         printf("%lld
    ", ((i-1)/(int)pow((double)10, len-pos))%10);
    44     }
    45 }
    46 
    47 int main(void)
    48 {
    49     run();
    50 
    51     return 0;
    52 }
    Number Sequence
  • 相关阅读:
    MYSQL数据库查看被锁状态以及解锁
    MongoDB命令
    代码重构
    笔试常见之C类型转换
    WeakReference(弱引用)(转)
    Linux ubuntu16.04下vim的安装与配置
    mysql Access denied for user root@localhost之错误解决方法(错误码:1045)
    mysql服务无法启动报错1067解决办法 (mysql启动错误1067)
    js的ajax封装
    windows下apache tomcat整合
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3407379.html
Copyright © 2020-2023  润新知