这道题目是从某某鱼那里得来了, 与诸君分享之。
某人买了 72 支笔, 总共花了 3A7.6B 元, 请问每支笔要多少钱? 当然题目里面的 A 和 B 都是整数来的, 而且都是处于 0-9 之间。
我们先将题目转化一下, 变成 3A76B 这样的一个数怎样才可以被 72 整除。首先列出一个 72 乘法表,
72*0=0, 72*1=72, 72*2=144, 72*3=216, 72*4=288
72*5=360, 72*6=432, 72*7=504, 72*8=576, 72*9=648
显然商只可能是一个三位数, 不妨设为 XYZ。以下的步骤都要看着这个乘法表进行。
先看 3A7, 除以 72 后我们只能取 X 为 4 或者 5, 因为如果是其他数字的话很显然不能得到 3A7 这样是数字。先取 X=4, 我进行下一步, 使:
3A768-72*400=(A+1)96B.(这四个四位数, 前面的 A+1 说的是千位数是 A+1)
我们从 96 着手, 怎样才能使 72*YZ 的结果的中间两位是 96 呢? 显然只能是 72*Y 的后两位加上 72*Z 的前两位等于 96 才能使之成立, 这时候乘法表再现神通了, 我们从乘法表查表得知,
72*5=360 的前两位 36 与 72*5=360 的后两位 60 相加可得 96, 以及 72*6=432 的后两位 32 与 72*9 的前两位 64 相加也可以得到 96, 于是 YZ 的取值可以是 55 或者 69。
于是我们就得到了两个解,455 或者 469, 再转换为原题就是 4.55 元或者 4.69 元.
接着再把 X=5 代入按照上面的思想算一遍, 发现无解, 这道题就算解完了。后面是 C++写的程序, 用来验算, 有兴趣的可以看看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include<iostream> using namespace std; int main() { int a=0,b=0,k; for(a=0;a<=9;a++) for(b=0;b<=9;b+=2) //b的跳跃是2,因为最后一位B必然是偶数(可以被72整除),用于加速 { k=30760+b+a*1000; //所有数字均为整数会更快 if(k{5f7b659ff3b2818cd787bc9e2e970b98d3e4ece1905bf98c409dc266242d6105}72==0) //这也是为什么要将K转成整数的原因 cout<<"result:"<<k/72<<" with A="<<a<<" and B="<<b<<endl; } return 0; } |
得出结果与上面算出来的是一样的。
BUG
3A768-72*400=(A+1)96B
应该是
3A76B-72*400=(A+1)96B
谢谢提醒.. 我竟然出现这么大的错误, 唉唉, 老了