当前位置: 代码迷 >> 综合 >> HAUT OJ 1202: 韩信点兵
  详细解决方案

HAUT OJ 1202: 韩信点兵

热度:77   发布时间:2023-12-04 03:35:26.0

问题描述:

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而

他每次只掠一眼队伍的排尾就知道总人数了。现有一个至少2人且不超过n人的军队,若是每排a人,每排b人,每排c人则都

会余下1人,问这个军队至少有多少人

输入:

输入四个正整数对应题目中的a,b,c,n(2<=a,b,c<=28000,n<1000000000)

输出:

输出最小答案,如果无法得出科学的答案,则输出"Wrong count!"

样例输入:

2 3 5 100000

样例输出:

31

原因分析:

我的代码运行超时,原因是因为n的值为10的9次方,导致循环次数较多,时间超时

1.继续采用该种方法,但不每个数都循环一次,减少不必要的循环

2.计算三个数的最小公倍数 然后+1 (待后续补充)

#include<stdio.h>
#include<math.h>
int main()
{int a,b,c,n,i,f=1;scanf("%d%d%d",&a,&b,&c);for(i=2;i<=n;i++)if(i%a==1&&i%b==1&&i%c==1){printf("%d",i);f=0;break;}if(f==1)printf("Wrong count");return 0;
}

解决方案:

#include<stdio.h>
#include<math.h>
int max(int a,int b,int c){                       //自定义函数maxif(a>b&&a>c) {          // 若a的值最大return a;           // 返回a} else if(b>a&&b>c) {   // 若b的值最大return b;           // 返回b} else {return c;           //   否则返回c}}
int main()
{int a,b,c,n,i,f=1,p,q=1;scanf("%d%d%d%d",&a,&b,&c,&n);p = max(a,b,c);for(i=p;i<=n;){if(i%a==0&&i%b==0&&i%c==0&&i<=28000&&i+1<=n){printf("%d",i+1);f=0;break;}q++;           i=p*q;}if(f==1)printf("Wrong count!");return 0;
}

我理解的是, 举例如: 2 3 5     则p=5,然后q从1开始加,  q=2的时候,i=p*q  是 5 和2 的倍数,

同理q=3的时候,i是  3 5的倍数,继续加,会遇到一个i为 2 3 5的公倍数(遇到第一个就 break,应该就是最小的公倍数)