C语言 百马百担的问题!

来源:百度知道 编辑:UC知道 时间:2024/05/19 00:23:20
这是经典的"百马百担"问题:有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?
怎么解啊?我是C语言初学者,请教各位了,用最基本的方法就可以

求的是马的个数,所以没有歧义
#include <stdio.h>
int main(void){
int i,j,k;
for(i=100/3;i>0;i--)
for(j=100/2;j>0;j--)
for(k=100;k>0;k-=2){
if(((i+j+k)==100)&&((3*i+2*j+k/2 )== 100))
printf("%d ,%d ,%d\n", i,j,k);
}
return 0;
}
楼上的说我刚才逻辑错误,其实不然,因为34*3>100所以如果取上值的话,是超过100的,所以直接取下值。
你说逻辑,那我们从逻辑上来论证:
设r = [a/b]+1, 其中a为担总数, b为每马担数
则当[a/b] = a/b时, 有 r = a/b + 1, r> a/b
当[a/b] < a/b 时, 因为 0 < a/b - [a/b] < 1, 有 a/b < [a/b] + 1 = r, 即 r > a/b
综上: r > a/b
又:a/b * b = a, 则 必有 r * b > a
根据提设条件对于任意的大马个数x, 有 x*b <= a
因此 r不属于x存在的集合,不在取值范围之列。
仔细思考再下结论

楼上的代码错误
大马的个数应该不超过100/3=33.333.....个,取整应该为34个
中马的个数不超过100/2=50
小马的个数不超过100/0.5=200,但是马的总数为100个,所以小马的个数不超过100个
所以可能结果是相同的,但是代码的逻辑有错误。
正确的代码应该为
#include <stdio.h>
int main(void){
int i,j,k;
for(i=100/3 + 1;i>0;i--)
for(j=100/2;j>0;j-