Python每日两题系列(1月1号)

Python每日两题系列(1月1号)


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

分析:
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 的所有数字循环计算即可。

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)

再换一个思路:
设该数为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。

for x in range(1, 13):
    a = 84/x -x/2
    if int(a) == a:
        n = a ** 2 - 100
        print(n)

再换一个思路:
分析:
设这个整数为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=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)))

暴力方法:

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

一句话的骚操作←_←(暴力方法):

print([n**2-100 for m in range(168) for n in range(m) if(m+n)*(m-n)==168])

NO.2:
输入某年某月某日,判断这一天是这一年的第几天?

分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天

year = int(input('year:\n'))
month = int(input('month:\n'))
day = int(input('day:\n'))
 months = (0,31,59,90,120,151,181,212,243,273,304,334)
if 0 < month <= 12:
    sum = months[month - 1]
else:
    print ('data error')
sum += day
leap = 0
if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
    leap = 1
if (leap == 1) and (month > 2):
    sum += 1
print ('it is the %dth day.' % sum)

换个思路:

import time

def datecount(date):
    date0=date[0:4]+"-01-01"
    datet=time.strptime(date,"%Y-%m-%d")     #将输入的字符串转化为时间元组
    date0t=time.strptime(date0,"%Y-%m-%d")  
    dates=time.mktime(datet)                #将时间元组转化为时间戳
    date0s=time.mktime(date0t)
    count=(dates-date0s)/(3600*24)          #输入日期的时间戳减当前年份0101的时间戳除以每天秒数
    return count+1

a=input("请输入日期:格式如2017-06-16\n")
print("{}是{}年第{}天".format(a,a[0:4],int(datecount(a))))

再换个暴力思路,利用python的time模块一句话解决:

import time
print(time.strptime('2017-9-20', '%Y-%m-%d')[7])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值