• python基础练习题(一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?)


    day2

    ---------------------------------------------------------------

    实例003:完全平方数

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

    仿佛不会思考,直接上手写。。。

    1 k = 10001
    2 for i in range(0,k):
    3     for j in range(0,k):
    4         if j*j ==(i+100):
    5             for k in range(0,k):
    6                 if k*k ==(i+268):
    7                     print(i)
    8                     continue

    嗯,假装找到几个值,但这代码看得自己想吐,效率真TM慢,真low

    标准答案

    思路是:最坏的结果是n的平方与(n+1)的平方刚好差168,由于是平方的关系,不可能存在比这更大的间隙。至于判断是否是完全平方数,最简单的方法是:平方根的值小数为0即可。

    结合起来:

    1 n=0
    2 while (n+1)**2-n*n<=168:
    3     n+=1
    4 
    5 for i in range((n+1)**2):
    6     if i**0.5==int(i**0.5) and (i+168)**0.5==int((i+168)**0.5):
    7         print(i-100)

    对比下,这里应该找到数的最大值,而我少了这一步,数学改补补了。对了求一个平方根可以用   x**0.5 == int (x**0.5)   ,脑子锈了。。。下面是个更烧脑的答案。。。

    其他答案

    分析:整数+100是一个完全平方数即大于0的数,所以这个数应该是大于-99,否则不会是完全平均数。

    x+100 =n*n

    x+100+168=m*m 

    2x+268=n*n+m*m

    2x=n*n+m*m-268

    x=(n*n+m*m-268)*0.5

    m*m-n*n=168,根据这条推断,100*100-99*99=10000-9801=199>168,所以m和n的值都小于100,那么x的值就小于10000,所以

     1 import math
     2 
     3 
     4 #方法一
     5 for i in range(-99,10000):
     6     x = int(math.sqrt(i+100))
     7     if x*x == i+100:
     8         y = int(math.sqrt(i+100+168))
     9         if y*y==i+100+168:
    10             print(i)
    11             
    12             
    13 #方法二,再次优化,以m,n来写代码,n<100,又因为m*m=n*n+168,所以m>math.sqrt(168),即m>13,这个方法循环次数更少
    14 for m in range(13,100):
    15     n = int(math.sqrt(m*m-168))
    16     if n*n ==m*m-168:
    17         print(m*m-168-100)
  • 相关阅读:
    flume 安装过程记录
    hive 动态分区插入
    hive 数据导入
    scala 学习笔记
    hive 日志
    Linux下设置和查看环境变量
    数据结构(4):图解递归调用机制
    使用数据结构栈实现表达式计算器
    数据结构(3):java使用数组模拟堆栈
    使用Vue和Element-ui的cdn模式临摹一个后台框架
  • 原文地址:https://www.cnblogs.com/qgc1995/p/14762220.html
Copyright © 2020-2023  润新知