我试着这样做,但这个算法很慢。 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);
}
}
答案 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:
list
每个数字覆盖多少页(即3位数,总共涵盖999页)list
(即所有3位数字的总和为2700,所有两位数字的总和为180)list
包含累计总和digitSum
然后,我发现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。等