问题描述:
给定下列除式,其中包含5个7,其他打X的是任意数字,请加以还原。
X 7 X -------------商
—————————————————————
除数----- X X √ X X X X X ----------被除数
x 7 7
----------------
X 7 X
X 7 X
----------------
X X
X X
----------------
0
这个程序我没有什么好的思路,所以也不会写,能把示例代码看懂就行了!
示例代码:
def findHead():
for x in xrange(10, 100):
for y in xrange(1, 10):
if str(x * y)[1:] == '77' and str(x * 7)[1] == '7':
return x, y, x*y, x*7
def findTail(x):
for y in xrange(1, 10):
if x*y < 100:
return y, x*y
def main():
chu, shang1, ji1, ji2 = findHead()
shang3, ji3 = findTail(chu)
res = ji3 + ji2 * 10 + ji1 * 100
return res, chu, int(str(shang1)+'7'+str(shang3))
print main()
代码分析:
首先根据除式已知:
1、被除数的范围是10000到99999,除数的范围是10到100,且可以整除;
2、商为100到1000之间的数,且十位数字为7;
3、商的第一位乘以除数是个三位数,且后两位为77;
4、被除数的第三位一定为4;
5、7乘以除数是一个三位数,且第二位为7,对应第二个X7X;
6、商的最后一位不能为0,且与除数的积是一个二位数;
对于findHead函数,for循环中的x是除数,y是商的第一个数,那么可以判断如果x*y(也就是X77)的后两位数等于77并且x*7(也就是第二个X7X)的第二个数等于7,那么就返回除数x,商的第一个数y,第一个积x*y和第二个积x*7;
对于findTail函数,传入根据findHead函数返回的除数x,因为商的第三个数y是介于1到10的,所以,如果x*y(也就是XX)小于100,那么就返回商的第三个数y和第三个积x*y;
最后,由于已知了第一个积X77,第二个积X7X和第三个积XX,那么就可以通过 积3+积2*10+积1*100来得到被除数,除数不用算就是上面的x,商的值(字符串化)就是findGead中的y加上已知的7加上findTail中的y;
结果:
E:\python\python.exe D:/pycharm/python/奇猫百题/除式还原.py
(51463, 53, 971)
可以根据答案带入尝试!
转载于:https://blog.51cto.com/jmbzs/1786853