一本书的页码从自然数1开始顺序编码知道自然数n。书的页码按照通常的习惯编排,每个页码不含多余的前导数字0。例如,第6页用数字6表示,而不是06或006等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0~9。
算法设计:给定书的总页码的十进制整数n,计算书的全部页码中分别用到多少次数字0~9。
该算法实现的C#代码如下:
using System;
namespace algorithm
{
class Program
{
static int length1 = 0;
static void Main(string[] args)
{
int count=Convert.ToInt32(Console.ReadLine());
string s = count.ToString();
length1 = s.Length;
for (int i = 0; i <= 9; i++)
{
int c = Compute(count, i);
if (i == 0)
{
string x = "";
for (int j = s.Length - 1; j >= 0; j--)
{
if (j == 0)
x += "0";
else
x += "1";
}
c -= Convert.ToInt32(x);
}
Console.WriteLine(i+"的数量是:"+c);
}
Console.ReadLine();
}
public static int Compute(int number,int i)
{
string s = number.ToString();
int length = s.Length;
int c =Convert.ToInt32((s[0]-48) * (length-1) * System.Math.Pow(10, length - 2)) ;
if (i == 0 && length1 - length - 1 > 0)
c += (length1 - length - 1) * (Convert.ToInt32(s)+1);
length1 = length;
if(length==1)
return c += (i>0 && i<=number ? 1:0);
if (i >= 0 && i < s[0] - 48)
c += Convert.ToInt32(System.Math.Pow(10, length - 1));
if(i==s[0]-48)
c += number % Convert.ToInt32(System.Math.Pow(10, length - 1)) + 1;
return c + Compute(number % Convert.ToInt32( System.Math.Pow(10, length - 1)), i);
}
}
}
经过反复的测试,以上的代码可以正确输出0~9的次数。
如果发现上面的实现有什么不妥之处,请指出来,谢谢。
如果哪位大侠有更好性能的实现方法,请回复一下,让小弟学习学习,感激不尽。