题目007_1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析1:
假设该数为 x。
1、则:x + 100 = , x + 100 + 168 =
2、计算等式:= (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: #由于i * j = 168,则168肯定能整除i;
j = 168 / i; #由于i * j = 168,
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)
程序分析2:
设该数为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):
n = 84/x -x/2
if int(n) == n:
x = n ** 2 - 100
print(x)
程序分析3:
力求使用最简单易读的方法解决问题:
缺点耗时。
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 )
程序分析4:
import math
for i in range(1000):
x = math.sqrt(i+100)
y = math.sqrt(i+100+168)
if x%1==0 and y%1==0:
print(i)
题目007_2:输入某年某月某日,判断这一天是这一年的第几天?
程序分:1:
【个人备注】:知道python有时间元组这一概念,这道题完全不需要计算。
时间元组包含九个属性
tm_year 年
tm_mon 月(1~12)
tm_mday 日(1~31)
tm_hour 时(0~23)
tm_min 分(0~59)
tm_sec 秒(0~61, 60或61是闰秒)
tm_wday 星期(0~6, 0是周一)
tm_yday 第几天(1~366, 366是儒略历)
tm_isdst 夏令时(平时用不到)
import time
date = input('输入时间(例如2018-08-23):')
st = time.strptime(date,'%Y-%m-%d') # 时间文本转化成时间元祖
num = st.tm_yday
print(num)
程序分析2:
以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天:
year=int(raw_input("年:\n"))
month=int(raw_input("月:\n"))
day=int(raw_input("日:\n"))
months1=[0,31,60,91,121,152,182,213,244,274,305,335,366] #闰年
months2=[0,31,59,90,120,151,181,212,243,273,304,334,365] #平年
if ((year%4==0)and(year%100!=0)) or((year%100==0)and(year%400==0)):
Dth=months1[month-1]+day
else:
Dth=months2[month-1]+day
print "是该年的第%d天"%Dth