描述

一个四位数,各位数字互不相同,所有数字之和等于6,并且这个数是11的倍数。
满足这种要求的四位数有多少个?各是什么?‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入格式

该题目没有输入‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输出格式

第一行输出符合条件的数字个数‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
第二行以列表形式输出所有满足条件的四位数,列表元素按由小到大顺序排列
各位数字互不相同

  1. len(set(str(num))) == 4 # 将数中的数字放入集合后,若集合长度为4则无重复数字

这个数是11的倍数

  1. num % 11 == 0 # 是11的倍数,即能被11整除,或者说对11取模的结果为0

所有数字之和等于6

  1. sum(map(int,str(num))) == 6
  2. # 用str()将数字映射为字符串,再用map()将字符串中的字任映射为整数
  3. # 用sum()函数对映射为整数的序列中的元素求和

参考代码:

  1. ls = []
  2. for num in range(1000,3211): #各位数加和为6的最大的数是3210
  3. if num % 11 == 0 and sum(map(int,str(num))) == 6 and len(set(str(num))) == 4:
  4. ls.append(num)
  5. print(len(ls))
  6. print(ls)

下面给出用列表推导式完成的代码,帮助理解推导式的应用

  1. ls = [num for num in range(1000,3211)if num % 11 == 0 and sum(map(int,str(num))) == 6 and len(set(str(num))) == 4] #各位数加和为6的最大的数是3210
  2. print(len(ls))
  3. print(ls)

下面给出用函数完成的代码,设置默认值参数,使程序具有通用性

  1. def result(n=4, s=6, b=11): # 参数缺省时计算和为6,11 倍数的4 位数
  2. ls = []
  3. for i in range(10 ** (n - 1), 10 ** n):
  4. sumi = sum(map(int, str(i)))
  5. if i % b == 0 and sumi == s and len(set(str(i))) == n:
  6. ls.append(i) # 符合条件的数字加到列表ls 里
  7. return len(ls), ls # 返回符合条件的数的个数和数的列表
  8. if __name__ == '__main__':
  9. print(*result()) # 无参数时计算和为6,11 倍数的4 位数
  10. num, sumOfn, base = map(int, input().split()) # 空格分隔3 个整数
  11. print(*result(num, sumOfn, base)) # 计算和为s,num 倍数的n 位数