You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何计算由一组无重复数字构成的所有数的总和?

Hey,这个问题其实不用硬着头皮枚举所有组合,找对规律分分钟就能算出来!我来给你拆解清楚:

核心思路:从数位的出现频率入手

不管是几位数字,我们只需要算出每个数字在每个数位上出现的次数,再结合数位的权重(比如千位是1000,百位是100),就能快速算出总和。

情况1:所有数字都是非零的不同数字

拿你举的例子:用1、2、3、4组成所有4位数。

  • 每个数位(千位、百位、十位、个位)上,任意一个数字会出现多少次?
    固定某一个数位的数字(比如千位选1),剩下的3个数字可以在剩下的3个数位任意排列,排列数是3! = 6次。也就是说,每个数字在每个数位上都会出现(n-1)!次(n是数字的总个数)。
  • 计算每个数位的总和:所有数字的和是1+2+3+4=10,每个数位的总和就是10*6=60
  • 最后乘以数位的权重和:千位权重1000,百位100,十位10,个位1,权重和是1111。所以总和就是60*1111=66660,和你枚举的结果完全一致!

推广成通用公式:
假设我们有k个不同的非零数字,它们的和为S,那么所有k位数的总和为:

总和 = S * (k-1)! * (10^k - 1)/9

这里(10^k - 1)/9就是111...1(k个1),刚好是所有数位权重的和。

情况2:数字包含0的特殊情况

如果数字里有0,要注意0不能在最高位,这时候需要稍微调整计算逻辑:
比如用0、1、2组成所有3位数:

  1. 先算「包含0开头的所有排列(也就是所有3位组合,包括无效的012这种)」的总和:用上面的公式,S=0+1+2=3k=3,总和是3*2!*111=666
  2. 再减去「以0开头的无效数的总和」:这些无效数其实是用剩下的数字(1、2)组成的2位数,总和是(1+2)*1!*11=33
  3. 最终有效数的总和就是666-33=633,和实际枚举的102+120+201+210的结果一致。

对应的通用公式:
假设我们有k个不同数字(包含0),所有数字的和为S,那么所有有效k位数的总和为:

总和 = [S*(k-1)!*(10^k -1)/9] - [(S-0)*(k-2)!*(10^(k-1)-1)/9]

简单来说,就是先算所有可能的排列总和,再减去以0开头的那些数的总和。

再举个验证例子

用0、1、2、3组成所有4位数:

  • 所有排列总和:(0+1+2+3)*3!*1111=6*6*1111=39996
  • 以0开头的数总和:(1+2+3)*2!*111=6*2*111=1332
  • 最终总和:39996-1332=38664
    实际枚举计算的话,18个有效数的总和确实是38664,完全匹配!

内容的提问来源于stack exchange,提问作者Kingsley Zhong

火山引擎 最新活动