问题描述:
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而
他每次只掠一眼队伍的排尾就知道总人数了。现有一个至少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,应该就是最小的公倍数)