SQL Server解题:《编程之美》1的数目

来源:这里教程网 时间:2026-03-02 10:00:37 作者:

读《编程之美》,有一题“1的数目”,题目如下:
给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。
例如:
N= 2,写下1,2。这样只出现了1个“1”。
N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,1的个数是5。
写一个函数f(N),返回1到N之间出现的“1”的个数,比如f(12)=5。

尝试了在SQL Server2000中解决,整体思路是:
如果在纸上试着将这些整数竖着列一下,容易发现这样的规律,单看个位、十位、百位....,会发现1在这些位上出现是有一定规律的。例如在个位上,每连续10个数字就会出现一次1,其他位上也有相似的规律。
代码如下:
Declare @Num Int,@Result Int,
@X Int, @Y Int, @Z Int, @I Int

Select @Num = 1000
Select @I = 1,@Result = 0

--分别统计@Num个数中,个位、十位、百位....上会出现多少个1
While @I <= Len(@Num)
Begin
--1在每一位上出现的频率是固定的,比如在个位上,每连续10个数字就会出现一次
Select @X = @Num / Power(10,@I),@Y = @Num % Power(10,@I)

Select @X = @X + 1 Where @Y >= 2 * Power(10,@I - 1) - 1
Select @Z = Case When @Y >= Power(10,@I - 1) And @Y < 2 * Power(10,@I - 1) - 1 Then Power(10,@I - 1) - (2 * Power(10,@I - 1) - @Y - 1) Else 0 End

Select @Result = @Result + @X * Power(10,@I - 1) + @Z

Select @I = @I + 1

End

Select @Result

[@more@]

相关推荐