You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在T-SQL查询中不使用*符号计算给定数字的阶乘?

不用乘法符号实现T-SQL阶乘计算

没问题!要在T-SQL里避开*符号实现阶乘,核心思路是用重复累加模拟乘法——毕竟乘法本质就是相同数值的多次相加嘛。这里给你两种可行的实现方案:

方案一:嵌套循环累加模拟乘法

这种写法和你原来的循环逻辑结构接近,只是把乘法操作替换成了内层的累加循环:

DECLARE @given_number INT = 5;
DECLARE @fact INT = 1;

WHILE (@given_number > 1)
BEGIN
    -- 用多次累加替代 @fact = @fact * @given_number
    DECLARE @temp INT = 0;
    DECLARE @counter INT = @given_number;
    WHILE (@counter > 0)
    BEGIN
        SET @temp = @temp + @fact;
        SET @counter = @counter - 1;
    END
    SET @fact = @temp;
    
    SET @given_number = @given_number - 1;
END

SELECT @fact AS 'Factorial is ';

逻辑说明:

  • 外层循环保持你原有的阶乘迭代逻辑,每次处理当前的递减数字
  • 内层循环通过将@fact累加@given_number次,得到等价于@fact * @given_number的结果,完全避开乘法符号

方案二:递归CTE+累加实现

如果你更喜欢声明式的写法,可以用递归CTE结合SUM和TOP来模拟乘法:

DECLARE @given_number INT = 5;

WITH FactorialCTE AS (
    -- 递归起始点:1的阶乘为1
    SELECT 1 AS current_num, 1 AS fact_value
    UNION ALL
    SELECT 
        current_num + 1,
        -- 通过SUM+TOP累加fact_value共(current_num+1)次,模拟乘法
        (SELECT SUM(fact_value) FROM (SELECT TOP (current_num + 1) fact_value FROM FactorialCTE) AS t)
    FROM FactorialCTE
    WHERE current_num < @given_number
)
SELECT fact_value AS 'Factorial is '
FROM FactorialCTE
WHERE current_num = @given_number;

逻辑说明:

  • 递归CTE从1!开始,每次迭代计算下一个数字的阶乘
  • 用TOP (current_num + 1)取出当前阶乘值current_num+1次,再求和,等价于fact_value * (current_num + 1)

注意事项:

如果需要计算较大数字的阶乘,建议把INT换成BIGINT类型,避免数值溢出问题。

内容的提问来源于stack exchange,提问作者Sohail Akhter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:11