【问题描述】在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按从1至7报数,记下最末一个士兵报的数为4;
最后按从1至11报数,最末一个士兵报的数为10;
请编写程序计算韩信至少有多少兵。
输入格式:
本题无输入
输出格式:
输出韩信至少拥有的士兵人数。
题目如上,着实不知道该怎么规定范围,程序总是报错不知道为什么。
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);
就是一个数,除以5余1,除以6余5,除以7余4,除以11余10
求最小的满足上述条件的数字
你直接写个while循环,i一直+,直到满足条件为止,就行了呀
不要写for循环
突发奇想:循环的效率太低了,何不直奔目标而去?韩信统领的士兵最多是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}
#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;
}