相传汉高祖刘邦问大将军韩信统御兵士多少,韩信答曰,每3人一列余2人、5人一列余3人、7人一列余2人。刘邦茫然而不知其数,你知其数吗?

图形化问题

韩信点兵问题 - 图1

公式化问题

总人数(被除数) 人/列(除数) 列(未知数) 余(余数) 表达式
? 3 x 2 3x+2
5 y 3 5y+3
7 z 2 7z+2
3x + 2 = 5y + 3 = 7z + 2

采用枚举法,初步探索此公式可能的解:

韩信点兵问题 - 图2
.
.
.
韩信点兵问题 - 图3

编程算法实现

  1. def caculate_soldiers(limit = 100):
  2. amount = []
  3. soldiers = limit
  4. while soldiers > 0:
  5. if soldiers%3 == 2 and soldiers%5 == 3 and soldiers%7 == 2:
  6. amount.append(soldiers)
  7. soldiers -= 1
  8. print('\nWhen total number limit to %d soldiers count:\n' % limit)
  9. index = 0
  10. text = ''
  11. while index < len(amount):
  12. text += str(amount[index]) + '\t\t'
  13. if (index+1) % 5 == 0:
  14. print(text)
  15. text = ''
  16. index += 1
  17. print(text + '\n')

不同的士兵总数

执行此函数:

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. if __name__ == '__main__':
  4. limits = [100, 1000, 10000]
  5. for limit in limits:
  6. caculate_soldiers(limit)

输出结果

  1. When total number limit to 100 soldiers count:
  2. 23
  3. When total number limit to 1000 soldiers count:
  4. 968 863 758 653 548
  5. 443 338 233 128 23