问题描述:

给定下列除式,其中包含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)


可以根据答案带入尝试!



题目出处:http://www.cheemoedu.com/exercise/56