python2.7练习小例子(三)

    3):题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    程序分析:假设该数为 x。1、则:x + 100 = n2, x + 100 + 168 = m2。2、计算等式:m2 - n2 = (m + n)(m - n) = 168。3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数。4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。7、接下来将 i 的所有数字循环计算即可。

    程序源代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

for i in range(1,85):
    if 168 % i == 0:
        j = 168 / i;
        if  i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0 :
            m = (i + j) / 2
            n = (i - j) / 2
            x = n * n - 100
            print(x)

    以上实例输出结果为:

-99
21
261
1581

    再来看其它的例子:设该数为x:x + 100 = n^2, n^2 + 168 = m^2。设m=n+k(不妨设m,n,k均为自然数):带入m^2-n^2-168,得k^2+2nk=168。解得n=84/k - k/2;由于n,k均为自然数,则nk>=1,故1<=k^2<168,故1<=k<=12。

#!/usr/bin/env python
for x in range(1, 13):
    a = 84/x -x/2
    if int(a) == a:
        n = a ** 2 - 100
        print(n)

    再来看另外一个:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

for i in range(1, 85):
    if 168 % i == 0:
        j = 168 / i
        if i > j:
            m = (i + j )/2
            n = (i - j )/2
            if  m * m - 268 == n * n - 100 and (n * n - 100) % 1 == 0:
                print('x = ', m * m - 268)

    还有一个如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

for m in range(168):
    for n in range(m):
        if (m+n)*(m-n)==168:
            x=n**2-100
            print "符合条件的整数有:",x

    根据题意可先求出所求数的最大范围,并在范围内部循环测试是否有满足条件的数字,若有,则打印出来:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

i = 1
#求出最大范围
while ((i+1)*(i+1)-i*i) <= 168:
      i += 1
#循环测试并打印
for j in range(1,i):
    for k in range(1,i):     
        if (k*k - j*j) == 168:
            print k*k-268

    再来看一个:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

#一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

'''
分析:
设这个整数为x
1、 x+100=n^2和x+100+168=m^2
推出 m^2-n^2=168
即   (m+n)(m-n)=168
设    m+n=i m-n=j
则    i*j=168
由    i>0 j>0   推出  i%2=0 j%2=0
由    168=2*2*2*3*7
上面两个条件推出i与j值的范围[2,4,6,12,14,28,42,84]
反推:m=(i+j)/2和n=(i-j)/2 并且 n>0 推得 i>j
则     i=[14,28,42,84]
       j=[12,6,4,2]
'''

arr1=[14,28,42,84]
arr2=[12,6,4,2]
for i in range(0,4):
    m=(arr1[i]+arr2[i])/2
    n=(arr1[i]-arr2[i])/2
    x=n*n-100
    print x

    思路就是根据公式求得X1和X2,然后并集操作。得出结果:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

#X1=N*2-100的合集
x1 = map(lambda i:i**2-100,range(1,100))

#X2=M*2-100-168的合集
x2 = map(lambda i:i**2-100-168,range(1,100))

#两个合集求并集结果
print(set(list(x1)) & set(list(x2)))

    设该数为x:x + 100 = n^2, n^2 + 168 = m^2。设m=n+k(不妨设m,n,k均为自然数):带入m^2-n^2-168,得k^2+2nk=168。在此基础上 k(k+2n)=168   , 若 k为奇数,k+2n也为奇数,等式不成立,所以k为偶数。则等式除以4,得(k/2)(k/2+n) =42, 令 t=k/2, (t>0)。t(t+n)=42  则 n= 42/t -t ; 由于n大于0,所以 t小于等于6 ,42/t 又是整数,得到 t 的取值为 1,2,3,6。对应得到 x =1581,261,21,-99。这是纯算出来的。

    力求使用最简单易读的方法解决问题:

#!/usr/bin/python
# -*- coding:utf-8 -*-

t = []
for m in range(168):
    for n in range(m):
        if m**2 - n**2 == 168:
            x = n**2 - 100
            t.append(x)
print('符合条件的整数有:',t )

    来看Python3 测试:

>>> print([n**2-100 for m in range(168) for n in range(m) if(m+n)*(m-n)==168])
[-99, 21, 261, 1581]

    因为题目说明x是整数,但没有说明n和m一定大于零,此处考虑了n和m小于零的情形。x+100=n^2;x+100+168=m^2;(注意,没有要求m,n一定大于零)。m^2-n^2=168 即 (m+n)(m-n)=168。设 m+n=i,m-n=j,则m=(i+j)/2;n=(i-j)/2 有 i*j=168, 因为 m,n 都是整数且 m!=n, 所以 j,i!=0, 因为i*j是正数,故 abs(i)>=1,abs(j)>=1。所以i和j的上限可以取 168。因此m和n的上限也是168,下限可以取-168(注意,m,n的取值范围可以放得很大,不影响结果,因为限制条件可以自己去约束,但所取的范围一定要比真实范围大)。Python3 下测试代码如下:

x=[]
for m in range(-168,169):
    for n in range(-168,169):
        if (m+n)*(m-n)==168:#m,n都是整数
            x.append(n**2-100)
x=set(x)#用集合的方法去掉重复值
x=list(x)#将集合类型改为列表类型
print('要求的值为:',x)

    还有一个参考:

for i in range(1, 17):
    for x in range(1, 168):
        if 168 - (i ** 2 + 2 * x * i) == 0:
            print x ** 2 - 100

    再来一个参考:

class Num:
    def __init__(self):
        pass
    def calc(self):
        for i in range(2,86):
            for j in range(2,86):
                if (i * j == 168) and (i > j):
                    #print(i,j)
                    if ((i % 2 == 0) and (j % 2 ==0)) or ((i % 2 != 0) and (j % 2 !=0)):
                        n = (i-j)/2
                        d = int(n*n -100)
                        print(d)
a = Num().calc()

    先決定範圍,如果(i+1)^2 - i^2 > 168 則超出範圍, 找到i。完全平方定義開根號後為整數 =>。y**0.5 對1取餘數=0 且 z**0.5 對1取餘數=0:

i=0
while i^2 < 168:
    i+=1
for x in range(-i**2,i*i):
    y=x+100
    z=y+168
    a=complex(y+0j)**0.5%1
    b=complex(z+0j)**0.5%1
    c=a%1
    d=b%1
    if c== d == 0:
        print x

    最后来看个例子:

#!/usr/bin/python
# coding=utf-8

# x^2 + 168 = y^2,则x、y都小于168,而且x应小于y
for y in range(168):
    for x in range(y):
        if y**2 - x**2 == 168:
            n = x**2 - 100
            print n
    不得不说,奇思妙想啊。。。对于本人来说,很难达到这种程度的。如果感觉不错的话,请多多点赞支持哦。。。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值