zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    LG P2473 [SCOI2008]奖励关
    三分法
    P2521 [HAOI2011]防线修建
    金融分析-ipython
    vue --webpack的使用
    Vue-npm命令解析
    Vue-router VUE路由系统
    爬虫--总目录
    爬虫-scrapy框架
    爬虫-性能相关- twisted-tornado
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3407379.html
Copyright © 2011-2022 走看看