韩信点兵问题
问题描述:求最小整数n,使得n%3=a,n%5=b,n%7=c,并且使得10<=n<=100,如果不在这个区间,输出No,否则输出该数。
问题解析:70是5和7的公倍数,并且70%3=1,所以如果n%3=a,则先假设70*a是n的一部分;这种情况下加上或减去5或7的某倍后对该描述没有影响
同理,21是3和7的公倍数,21%5=1,所以如果n%5=b,也假设21*b是n的一部分;这种情况下加上或减去3或7的某倍后对该描述没有影响
同理,15是3和5的公倍数,15%7=1,所以如果n%5=c,也假设15*c是n的一部分;这种情况下加上或减去3或5的某倍后对该描述没有影响
综上,暂且假设n=70*a+21*b+15*c;
又3、5、7的公倍数为105,n加上或者减去105 的某倍对该描述没影响,所以n=70*a+21*b+15*c-k*105;
例子代码:
1 //韩信点兵的最小值 2 #include<stdio.h> 3 int a,b,c,n; 4 int main() 5 { 6 scanf("%d%d%d",&a,&b,&c); 7 n=70*a+21*b+15*c; 8 while(n-105>0) n=n-105; 9 if(10<=n&&n<=100) printf("%d\n",n); 10 else printf("No\n"); 11 return 0; 12 }
运行结果: