zoukankan      html  css  js  c++  java
  • HDU 1597(二分法)

    find the nth digit

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 11272    Accepted Submission(s): 3365



    Problem Description
    假设:
    S1 = 1
    S2 = 12
    S3 = 123
    S4 = 1234
    .........
    S9 = 123456789
    S10 = 1234567891
    S11 = 12345678912
    ............
    S18 = 123456789123456789
    ..................
    现在我们把所有的串连接起来
    S = 1121231234.......123456789123456789112345678912.........
    那么你能告诉我在S串中的第N个数字是多少吗?
     

    Input
    输入首先是一个数字K,代表有K次询问。
    接下来的K行每行有一个整数N(1 <= N < 2^31)。
     

    Output
    对于每个N,输出S中第N个对应的数字.
     

    Sample Input
    6 1 2 3 4 5 10
     

    Sample Output
    1 1 2 1 2 4

    题意得关键就是每过一个串就增加一个数位

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    long long tmp[70000]; //存下到目前对应数组下标位置存下的数位的数量
    
    long long n;
    long long tmp2;
    void my_search(int l, int r)
    {
         int m;
         m = (l + r) / 2;
         if (tmp[m] < n && tmp[m + 1] >= n) //找出前面子串的数位和
         {
           tmp2 = m;
           return ;
         }
         if (tmp[m] >= n)
            my_search(l, m - 1);
         if (tmp[m + 1] < n)
            my_search(m + 1, r);
    }
    
    int main()
    {
    
        int i;
        int T;
        int ans;
        for (i = 1; i <= 65536; i++)
          tmp[i] = tmp[i - 1] + i;
    //    cout << tmp[65536] << endl;
        cin >> T;
        while (T--)
        {
          cin >> n;
          tmp2 = -1;
          my_search(1, 65536);
          ans = n - tmp[tmp2]; //减去前面完整的数位子串,得到最后所在的子串的位置,这里的位置即对应数字
          ans = ans % 9;
          if (ans == 0) ans = 9;
          cout << ans << endl;
        }
       return 0;
    }
    
    
    网上另一个简单的解法:
    #include<iostream>
    using namespace std;
    int main()
    {
        int k;
        int n;
        scanf("%d",&k);
        while (k--)
        {
              scanf("%d",&n);
              int a = 1;
              while ( n > a )
              {
                    n -= a;   //a = sn; 最后 n==a 时,就为最后一行 
                    a++;
              }
              n%=9;  if(n==0) n=9;   //sn 的前x*9一定是123456789 ,所以磨9后得到第n位的数。 
              printf("%d
    ",n);
        } 
        return 0;
    }
    

    压根都没用到二分查找算法 (~ ̄▽ ̄)→))* ̄▽ ̄*)

    方法二:,解方程,一元二次方程求根公式
    
    #include <iostream>
    #include <math.h>
    using namespace std;
    
    int main(){
    int n;
    double m;
    double i,j;
    unsigned long k;
    scanf("%d",&n);
    while(n--){
       scanf("%lf",&m);
    
       i = ceil((sqrt(1+8*m)-1)/2);
    
       k =m - i*(i-1)/2;
       
       if (k%9==0)
       {
        printf("9
    ");
       }else{
        printf("%ld
    ",k%9);
       }
    }
    return 0;
    }

    没看懂。。

  • 相关阅读:
    七七四十九劫,九九八十一难
    Android中用layer-list编写阴影效果
    Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
    Effective C++ 24,25
    windows系统port监听
    线程同步辅助类——Exchanger
    C/C++中constkeyword
    【COCOS2DX-游戏开发之三三】TMX边界控制与小窗体内预览TMX
    IDFA的值什么时候会发生改变
    hadoop(六)
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256443.html
Copyright © 2011-2022 走看看