65.9K
CodeProject 正在变化。 阅读更多。
Home

在 SQL Server 中生成范围内的阿姆斯特朗数

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2010年1月9日

CPOL

1分钟阅读

viewsIcon

21726

如何生成 0 到 999 之间的阿姆斯特朗数。

引言

虽然文章标题是阿姆斯特朗数生成,但其基本思想是展示数字表与递归 CTE 的结合概念。

本文面向不了解数字表、CTE 是什么以及如何有效地使用它们的组合编写复杂程序的人员。

背景

什么是阿姆斯特朗数?

如果一个数字各个位上数字的立方和等于该数字本身,那么它就是一个阿姆斯特朗数。

使用代码

数字表是一个只包含连续数字的表。它在许多情况下都很有帮助,尤其是在处理字符串操作时。有很多方法可以生成它们,但我将只关注使用递归 CTE 方法生成它们。

为此,我们可以这样做

WITH NumTab AS(
SELECT 1 AS Num UNION ALL SELECT Num+1 FROM NumTab WHERE Num <= 100)
SELECT * FROM NumTab

上面的程序将生成 1 到 100 之间的数字。

在生成阿姆斯特朗数的各种替代方法中,这里有一种方法:

WITH NumTab AS(
SELECT 0 AS Num UNION ALL SELECT Num+1 FROM NumTab WHERE Num < 999)
SELECT ArmstrongNumber = Num FROM NumTab
WHERE 
    Num = POWER(COALESCE(SUBSTRING(cast(Num AS VARCHAR(10)),1,1),0),3)
        + POWER(COALESCE(SUBSTRING(cast(Num AS VARCHAR(10)),2,1),0),3)
        + POWER(COALESCE(SUBSTRING(cast(Num AS VARCHAR(10)),3,1),0),3)    
OPTION(MAXRECURSION 0)

输出

ArmstrongNumber
0
1
153
370
371
407

解释

首先,我生成一个数字表,然后从数字中提取各个位数。然后,我计算各个数字的立方和,并将其与原始数字进行比较,以查看它是否为阿姆斯特朗数。

关注点

该程序利用通过递归 CTE(SQL Server 2005 功能)创建的数字表。我欢迎任何帮助我改进文章的建议。

© . All rights reserved.