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])