要对书籍的页面进行编号,使用了n位数字。查找图书中的页数

时间:2018-04-29 10:13:26

标签: c# algorithm

我试着这样做,但这个算法很慢。 1< = n< = 10 ^ 9,所以n非常大!程序必须不再工作1秒

using System;

struct MainStruct
{
    private static void Main ()
    {
        int n = int.Parse (Console.ReadLine ());
        int page = 1, count = 0;
        while (true) {
            count = count + page.ToString ().Length;
            if (count == n) {
                break;
            }
            page = page + 1;
        }

        Console.WriteLine (page);
    }
}

2 个答案:

答案 0 :(得分:0)

试试这个:

n = 51 ## Or whatever you want

pagesCovered = [(10**m)-1 for m in range(1, 10)]
digitSum = [(i+1)*9*(10**i) for i in range(10)]
cumulativeSum = [sum(digitSum[:j+1]) for j in range(len(digitSum))]
for k in range(len(cumulativeSum)):
    if cumulativeSum[k] > n:
        maxDigits = k + 1
        break

pages = pagesCovered[maxDigits - 2] + ((n - cumulativeSum[maxDigits-2]) / maxDigits )

(这是python,但其算法也适用于C#

首先,我生成了一些list s:

  1. pagesCovered - > list每个数字覆盖多少页(即3位数,总共涵盖999页)
  2. digitSum - >每个数字总和的list(即所有3位数字的总和为2700,所有两位数字的总和为180)
  3. cumulativeSum - > list包含累计总和digitSum
  4. 然后,我发现cumulativeSum中的第一个总和大于n;该总和的索引告诉我们n的最大位数。最后,我通过查找数字1覆盖的页数少于最大数字来计算pages,然后将余数除以maxDigits以获取页面。

答案 1 :(得分:0)

string NumberOfPages(int numberOfDigits)
{
    return "Between " +
        Convert.ToInt32(Math.Pow(10, numberOfDigits - 1)).ToString()
        + " and " +
        Convert.ToInt32(Math.Pow(10, numberOfDigits) - 1).ToString();
}

10到99之间的任何数字都需要2位数,即10 ^ 1和10 ^ 2-1。等