题目描述:
大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子。她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋。
欧拉随便问:“卖了多少鸡蛋呢?”
不料一个说:“我们两人自己卖自己的,一共卖了150个鸡蛋,虽然我们卖的鸡蛋有多有少,但刚好得了同样的钱数。你猜猜看!”
欧拉猜不出。
另一个补充道:“如果我按她那样的价格卖,可以得到32元;如果她按我的价格卖,可以得到24.5元”。
欧拉想了想,说出了正确答案。
我们不是数学家,懒得列出公式来分析。但计算机可以“暴力破解”,就是把所有可能情况都试验一遍,撞上为止!
请写出每人鸡蛋的数目(顺序不限),用逗号隔开。
答案写在“解答.txt”中,不要写在这里!
思路:题目说要用暴力搜索,其实暴力搜索也是需要先梳理优化好再暴力的,
假设两人卖得鸡蛋数目为x,y,价钱分别为m1,m2。
根据题目所给条件,有以下公式:
x+y=150;x*m1=y*m2;x*m2=32;y*m1=24.5;
第一次写就是按照题目给的意思,暴力了一回,结果是无脑暴力,没有结果
献上失败代码:
#include<stdio.h> #include<stdlib.h> int main() { int x,y; double m1,m2; for(x=1;x<=150;x++) for(y=1;y<=150;y++) for(m1=0.1;m1<=2;m1+=0.1) for(m2=0.1;m2<=2;m2+=0.1) { if(x+y==150&&x*m1==y*m2&&x*m2==21&&y+m1==24.5) { printf("x=%d y=%d\n",x,y); } } system("pause"); return 0; }
发现m1和m2是可以消去的,这就省了不少事
已知x*m2=32,y*m1=24.5;那么m2=32/x,m1=24.5/y;带入"x*m1=y*m2"式子则有x*x*24.5=32*y*y;
最后综合上面所给的式子化出了x、y的对应关系:
x*x*24.5==32*y*y(范围1到150)
AC代码:
#include<stdio.h> #include<stdlib.h> int main() { int x,y; double m1,m2; for(x=1;x<=150;x++) { y=150-x; if(x*x*24.5==32*y*y) { printf("x=%d y=%d\n",x,y); } } system("pause"); return 0; }