关于循环问题.有一题没思路,求大神帮帮忙~~!!

小丫么小菜鸡 2018-11-06 09:58:31
韩信,在点兵时,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按1至7报数,记下最末一个士兵报的数为4;
最后按从1至11报数,最末一个士兵报的数为10;

你知道韩信有多少兵? 试编写相应程序.


==============================================================================
这一题,我完全搞不懂里面的数学规律,,,,,求大神帮帮忙,告诉我里面啥诀窍 ,谢谢
...全文
126 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakabulusi 2018-11-19
  • 打赏
  • 举报
回复
由于数字全部为互质数,为了减少运算量,可以找出符合 11 7 【最大数】条件的数字32,每次累加77【为了减少运算量】。 然后整除 5 和 6 查看余数。 效率有一定优化,但不是最好的算法。
只此冒泡君 2018-11-10
  • 打赏
  • 举报
回复
最笨的方法 就整除的问题
sunman2006 2018-11-09
  • 打赏
  • 举报
回复
这个感觉挺简单,假设人数是n,n-1能被5整除,n-5能被6整除,n-4能被7整除,n-10内被11整除,找到这个数字就行了,这个数字肯定比10大,从11开始找,参考代码如下:

#include<stdio.h>
void main()
{
int n=11;

while(!((n-1)%5==0&&(n-5)%6==0&&(n-4)%7==0&&(n-10)%11==0))
{
n++;
}

printf("%d\n",n);



}
ShanTUT 2018-11-09
  • 打赏
  • 举报
回复
韩信,在点兵时,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数: 按从1至5报数,记下最末一个士兵报的数为1; 再按从1至6报数,记下最末一个士兵报的数为5; 再按1至7报数,记下最末一个士兵报的数为4; 最后按从1至11报数,最末一个士兵报的数为10; 5、6、7、11的最小公倍数是2310。 所以楼主写个循环,for (i=0;i<2310;++i) 如果i同时满足:除以5余1、除以6余5、除以7余4、除以11余10,那么i就是答案。 如果用数学方法求解,用n表示要求算的结果。 n/5余数是1,那么令n=5a+1(a以及后面用到的b、c、d都是非负整数) 从1至6报数,记下最末一个士兵报的数为5,也就是说n/6的余数是5,a=2、8、14、20... 令a=6b+2,并代入n,得到n=30b+11。 按1至7报数,记下最末一个士兵报的数为4;换言之n/7余数是4 n=30b+11=(28b+7)+(2b+4)。其中(28b+7)/7是不会有余数的,所以要保证n/7余数是4,就必须保证(2b+4)/7余数是4 b=0、7、14、21...,所以令b=7c,并代入n,得到n=210c+11。 “最后按从1至11报数,最末一个士兵报的数为10”,也就是说n/11余数是10。 n=210c+11=(209c+11)+c。其中(209c+11)/11不会有余数,所以要保证n/11余10,就必须保证c/11余10。 c=10、21、32、43...所以记c=11d+10。并代入n,得到n=2310d+2111。 所以韩信至少有2111名士兵。
倾星 2018-11-07
  • 打赏
  • 举报
回复
引用 3 楼 ckc的回复:
笨办法。 1到11报数,最后一个是10,那么这个数除11余数是10 设置一个循环,从10开始,每次加11, 判断除5是不是余1 判断除6是不是余5 判断除7是不是余4 如果全部都符合,就是答案 不过这个问题数学上有更好的解法
请问还有什么更好的解答,求告诉
636f6c696e 2018-11-07
  • 打赏
  • 举报
回复
这个其实是数学思想,没有数学思想,很难转化成编程语言 从之前楼主三天打鱼两天晒网的问题看,楼主对这类模的问题没啥思路,建议可以从找规律搞起
super_admi 2018-11-07
  • 打赏
  • 举报
回复
请参考:中国剩余定理
额外参考:《射雕英雄传》郭靖背着黄蓉去找南僧求医遇阻
ckc 2018-11-07
  • 打赏
  • 举报
回复
笨办法。 1到11报数,最后一个是10,那么这个数除11余数是10 设置一个循环,从10开始,每次加11, 判断除5是不是余1 判断除6是不是余5 判断除7是不是余4 如果全部都符合,就是答案 不过这个问题数学上有更好的解法
  • 打赏
  • 举报
回复
从数学上解决这个题应该不难,先从数学上把这个题解决了,然后你的思路就来了,把数学上的解决方法再移植到C++/C
small_2018 2018-11-07
  • 打赏
  • 举报
回复
#include<iostream>
#define SIZE 1000000
using namespace std;
int main(void)
{
int soldier_num;
for(soldier_num=21;soldier_num<SIZE;soldier_num++)
{
if(soldier_num%5==1&&soldier_num%6==5&&soldier_num%7==4&&soldier_num%11==10)
{
cout<<"the number of the soldier is:"<<soldier_num;
break;
}
}
}
  • 打赏
  • 举报
回复
效率高,要从数学角度考虑:
由第一个条件可知,该数个位只能是1或者6,第二三条件可以排除6,从第四条件可知该数能表达为11n+10的形式,又因个位数必须是1,所以这个n只能是1、11、21...
所以:

#include <stdio.h>

int main()
{
for (int i = 1, j; (j = 11 * i + 10); i += 10)
if (j % 5 == 1 && j % 6 == 5 && j % 7 == 4 && j % 11 == 10)
{printf("%d\n", j); break;}

return 0;
}


只需要测试19个数就能得出答案,而不需要测试200多或者2000多个数。
英雄@末路 2018-11-07
  • 打赏
  • 举报
回复
引用 3 楼 ckc 的回复:
笨办法。
1到11报数,最后一个是10,那么这个数除11余数是10
设置一个循环,从10开始,每次加11,
判断除5是不是余1
判断除6是不是余5
判断除7是不是余4
如果全部都符合,就是答案
不过这个问题数学上有更好的解法

这个好,比++效率高多了。
@风轻云淡_ 2018-11-07
  • 打赏
  • 举报
回复
直接弄个循环,上限1000000,挨个除,设置条件都满足时跳出,条件为对5取余为1,且 对6取余为5.... 简单粗暴。
英雄@末路 2018-11-07
  • 打赏
  • 举报
回复
n = 10;
while(1) {
if(n%5==1 && n %6 == 5 && n %7 == 4 %% n % 11 = 10)
break;
n++
}
printf("%d\r\n",n);

求一个最小的出来就行了,这个如果数大小没限制,应该不止一个答案

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧