python基础训练 day2

python基础训练 day2,第1张

python基础训练 day2 python基础训练 day2

题目来源

小白打卡第二天,冲冲冲!

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

不知道这个数多大,设这个数为x,可以得到√(x+100)是一个整数,√(x+268)也是一个整数,就整个while循环,直到找出一个满足条件的数结束循环。

i = 1
while True:
    m = pow(i+100,0.5)
    n = pow(i+268,0.5)
    
    m_split = str(m).split('.')  # 按照小数点进行分割
    n_split = str(n).split('.')
    
    m_fractional = int(m_split[1])  # 取出小数部分
    n_fractional = int(n_split[1])
    
    if m_fractional == 0 and n_fractional == 0:
        print(i)
        break
    else:
        i += 1

找不到就一直找吧,哈哈

# 运行结果
21

之后看到答案,结果不止一个数,还包含负数,这我着实没有考虑到负数,尴尬了。。。

for i in range(-100,10000):
    try:
        m = pow(i+100, 0.5)
        n = pow(i+268, 0.5)
        m_split = str(m).split('.')  # 按照小数点进行分割
        n_split = str(n).split('.')
        m_fractional = int(m_split[1])  # 取出小数部分
        n_fractional = int(n_split[1])
    except:
        continue

    if m_fractional == 0 and n_fractional == 0:
        print(i)

看到答案后取个巧,稍微改一下,也能得到结果(战术后仰)

# 运行结果
-99
21
261
1581

最后附上答案的分析:

# 假设该数为 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 的所有数字循环计算即可。

没有做过这种题我是绝对想不到这种解法的…长经验了又

# 答案源码
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)
  • 第二题
输入某年某月某日,判断这一天是这一年的第几天?

来继续,年的话要判断一下是否为闰年,然后决定2月份的天数,之后就好做多了。

get_data = input('请输入 年.月.日。例如:2001.05.06') # 规定一个输入格式,之后就根据这个格式进行分割。
get_processed_data = get_data.split('.')  # 对数据进行处理得到分别年月日
year = int(get_processed_data[0])  # 今夕是何年
month = int(get_processed_data[1])  # 今夕是何月
day = int(get_processed_data[2])  # 今夕是何日
# 然后整两个列表分别把闰年月份的天数和平年月份的天数存进去
month_days_0 = {1: 31, 2: 29, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}  # 闰年历
month_days_1 = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}  # 平年历
# 对之前切片获取的年数据进行判断,是否为闰年。
if year % 100 == 0: # 判断是否为整百年
    if year % 400 == 0:
        count_year = '闰年'

    else:
        count_year = '平年'

else:
    if year % 4 == 0:
        count_year = '闰年'

    else:
        count_year = '平年'
days_add = 0  # 日的加总
for i in range(1, month):  # 建立索引
    if count_year == '闰年':
        days_add += month_days_0[i]  # 如果闰年就从闰年字典中索引 
    if count_year == '平年':
        days_add += month_days_1[i]  # 如果平年就从闰年字典中索引
days_add = days_add + day  # 别忘记还有一个从输入中获取的日
print(f'今天是{year}年({count_year})的第{days_add}天')

差不多了,看看我们劳动的成果

# 运行结果
请输入 年.月.日。例如:2001.05.06 2005.06.03
今天是2005年(平年)的第154天

这种问题的话实现了需求就行(狗头),虽然和答案不一样,绝对不是我懒!!

第二日打卡结束!

即兴背诗——千淘万漉虽辛苦,吹尽狂沙始到金

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5571885.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存