C语言练习:韩信点兵
题目说明:本题是中国经典问题,有多种解法,从数论课程角度看,是一个不定方程组,而且答案不唯一。
但这里采用程序解法,使用的是暴力破解。枚举可能的解,然后根据条件判断,满足所有条件时的数字就是所求解。
程序:
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) { 4 5 int ans = -1; 6 int i; 7 for(i=1; i<=10000; i += 5) { 8 if((i%6==5) && (i%7==4) && (i%11==10)) { 9 ans = i; 10 break; 11 } 12 } 13 if(ans!=-1) { 14 printf("There are %d soilders. ", ans); 15 } else { 16 printf("There are no answer. "); 17 } 18 19 return 0; 20 }
程序解释
6-7行:i 是循环变量,for循环中自增部分 i+=5,意思是按5自增,因初始值是 1, i 从 1 开始 每步加5,所以 i 的取值是 1,6, 11,... 这样也就满足了第一个条件。
8行:这里有三个条件,1%6==5,就是从1至6报数,最末一个士兵报的数是5,;其余两个条件类似。
9 - 10行:执行到这一行,说明满足所有条件,把 i 的值赋给变量ans保留结果; 然后在第10行利用break结束循环继续执行,因为程序已经找到答案了。
执行结果
解不唯一,稍微改一下程序,得到在10000内的结果
知识扩展:
本题从数学(数论)角度看是一个不定方程组问题,相关问题和知识可以参考这里
孙子定理(又称 中国剩余定理) https://baike.baidu.com/item/%E5%AD%99%E5%AD%90%E5%AE%9A%E7%90%86/2841597?fr=aladdin
另外这里有别人写的类似的程序:https://www.cnblogs.com/freinds/p/6388992.html
有关不定方程组的问题可以随便找一本数论书都可以看到相关详细理论,这里不再赘述。