止戈之武 2022-02-15 14:15 采纳率: 75%
浏览 504
已结题

用python解决“韩信点兵”问题,编写程序计算韩信至少有多少兵?

【问题描述】在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

按从1至5报数,记下最末一个士兵报的数为1;

再按从1至6报数,记下最末一个士兵报的数为5;

再按从1至7报数,记下最末一个士兵报的数为4;

最后按从1至11报数,最末一个士兵报的数为10;

请编写程序计算韩信至少有多少兵。

输入格式:

本题无输入

输出格式:

输出韩信至少拥有的士兵人数。

题目如上,着实不知道该怎么规定范围,程序总是报错不知道为什么。

  • 写回答

4条回答 默认 最新

  • piaoyiren 2022-02-15 14:37
    关注
    
    flag=0
    sum=6
    while(flag!=4):
        if (sum % 5 == 1):
            flag=1;
        else:
            sum=sum+1
            continue
        if (sum % 6 == 5 and flag == 1):
            flag = 2;
        else:
            sum = sum + 1
            continue
        if (sum % 7 == 4 and flag == 2):
            flag = 3;
        else:
            sum=sum+1
            continue
        if (sum % 11 == 10 and flag == 3):
            flag = 4;
        else:
            sum = sum + 1
            continue
    
    print(sum);
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 於黾 2022-02-15 14:24
    关注

    就是一个数,除以5余1,除以6余5,除以7余4,除以11余10
    求最小的满足上述条件的数字
    你直接写个while循环,i一直+,直到满足条件为止,就行了呀
    不要写for循环

    评论
  • 天元浪子 Python领域优质创作者 2022-02-15 15:30
    关注

    突发奇想:循环的效率太低了,何不直奔目标而去?韩信统领的士兵最多是5*6*7*11=2310人,在这个范围内,用5去除,余数为1的数的集合,可以写成:

    set(range(1, 2310, 5))
    

    同样,很容易写出满足其他条件的集合。这些集合的交集,就是最终的答案。

    >>> top = 5*6*7*11
    >>> set(range(1,top,5)) & set(range(5,top,6)) & set(range(4,top,7)) & set(range(10,top,11))
    {2111}
    
    评论 编辑记录
  • piaoyiren 2022-02-15 14:29
    关注
    
    #include <stdio.h>
    
    #include<iostream>
    using namespace std; 
    
    int main(){
        int flag=0,sum=6;
        while(flag!=4){
            if(sum%5==1){
                
                flag=1;
            }else{
                sum++;
                continue;
            }
            if(sum%6==5&&flag==1){
                flag=2;
            }else{
                sum++;
                continue;
            }
            if(sum%7==4&&flag==2){
                flag=3;
            }else{
                sum++;
                continue;
            }
            if(sum%11==10&&flag==3){
                flag=4;
            }else{
                sum++;
                continue;
            }
        }
        printf("%d",sum);
        return 0;
    }
    
    
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 已采纳回答 2月15日
  • 提问应符合社区要求 2月15日
  • 请提交代码 2月15日
  • 展开全部

悬赏问题

  • ¥50 burgers方程求逆
  • ¥15 matlab最小二乘法拟合非线性曲线提问
  • ¥15 电脑锁屏时vba运行SAP,excel数据不能复制到SAP
  • ¥50 74LS系列 74LS00 74LS04设计一个RS485电路(关键词-差分)
  • ¥30 各位help写一下代码
  • ¥15 在运行SDEdit模型下载不了
  • ¥15 求51控制l298n驱动的小车中超声波避障怎么写
  • ¥15 电脑连上WIFI却用不了
  • ¥30 MATLAB在RLC电路的固有响应和阶跃响应GUI仿真报告
  • ¥15 hyper-v出现的问题