「学习笔记」3.17代码学习
Posted stars_cj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「学习笔记」3.17代码学习相关的知识,希望对你有一定的参考价值。
今天还是继续刷acmcoder上的题,每天都会遇到很多新问题,不知道什么时候才能写得很顺畅呢。发现现在只能学白天,到晚上就很累了,一点都不想写代码了,今天晚上的时间又浪费了。看来晚上要换个学习内容了,也不能一直写代码。
2012素数判定
这道题其实是我昨天就思考的,对于素数判定用的是廖教程里的写法,后来再继续写就怎么也写不下去了,搞得乱七八糟,但是我还是想把它贴出来,这样以后自己回顾的时候也会知道自己是怎么走过来的。
encoding:utf8
##2012素数判定
##1 是3.16写的,没有写完,当然也是错的,但是我还是留下来吧,以后再看看我写这乱七八糟的代码,哈哈!
from itertools import ifilter #此处与上不同
##廖教程中素数判断
##埃氏筛法,就是说从2开始的所有自然数,先用2把序列中的2的倍数筛掉,得到新序列(3开始的奇数序列)
##然后,再将新序列中用3把序列中3的倍数筛掉,得到新序列,以此类推,筛掉5的倍数,筛掉7的倍数……最
##后筛下来的便是我们要求的素数序列
# def _odd_iter(): #构造了一个奇数序列生成器,此处特意构造的生成器主要是因为在下面引用时需要是生成器
# n=1
# while True:
# n=n+2
# yield n #这是个生成器,是个无限的序列
#
# def _not_divisible(n): #定义了筛选函数,将素数筛选出来
# return lambda x:x%n>0
#
# def primes(l): #定义生成器,不断地返回下一个素数
# yield 2 #此生成器的第一个元素是2
# it=_odd_iter() #这时的it是生成器
# while True: #这也是一个无限循环的序列
# n=next(it) #生成器指向序列下一个数
# yield n
# it=ifilter(_not_divisible(n),it) #筛选出来素数
# yield it
#
# ##已经被我搞得乱七八糟的了,这都是啥啊
# def is_prime(x,y):
# if x==0 and y==0:
# return None
# else:
# s=[]
# for n in range(x,y+1):
# s.append(n**2+n+41)
##2
#思路:构造一个判断素数函数,题目中的多项式中n取x:y会生成一个list
#将生成的list里的每个数做素数判断,若全是素数,返回‘ok’,若不全是素数,返回'no',x=0y=0时结束
def func(n):
return lambda x:x%n>0 #这是一个生成器
#在一定范围内找素数
def primes(x):
l=(x for x in range(2,x+1))
#yield 2 #加上这句的话在下面打印出来的2是单独一个list,其余的是一个list
n=next(l)
l=filter(func(n),l)
yield l #生成的是在(3,x)内的素数生成器,[如何把2也打印出来呢?]
def is_prime(x):
for i in primes(x):
return i #将(3,x)内的素数生成列表
if x in i:
return True
return False
# print is_prime(20)
# print is_prime(17)
def f(x,y):
if x==0 and y==0:
return None
else:
l=[]
for n in range(x,y+1):
s=n**2+n+41
l.append(s)
#print l
lst=filter(is_prime,l)
#print lst
if len(lst)==len(l):
print 'ok'
else:
print 'no'
f(1,5)
f(0,1)
f(0,0)
2013蟠桃记
这道题有意思,当时看这个名字就觉得是不是很难啊,能不能写出来,结果仔细一看,原来算是很简单的了,这要是放在以前我肯定没仔细看就说不会,可以现在要逼着自己认真的看下去,思考,写出来,发现好像也没那么难。所以说,这人要是不动脑子该有多可怕。
#encoding:utf8
#蟠桃记
##思路:这道题分析起来应该是递归,表达成递归公式应该是:a(1)=x,a(n-1)=1/2*a(n-2)-1,a(n)=1,给定n值,求x
##原题意是依次递减的数列,根据我个人习惯将其改成递增数列:b(1)=1,b(n)=2(b(n-1)+1),给定n,求b(n)
def func(n):
if n==1:
return 1
return 2*func(n-1)+2
print func(2)
print func(4)
2015偶数求和
我觉得这道题我写得并不好,感觉纯属用数学思想解决问题,所以相对来说感觉很啰嗦,很乱,别人不仔细读可能都晕晕的,可读性不强,方法2是大鲍提供的,认真研究一下。
#encoding:utf8
#偶数求和
##思路:先是构造偶数列,然后n%m得到该做几次每m个数求值,n/m得到最后不足m的有几个
##写法2回头认真看看,我感觉自己写的好啰嗦啊,一般人看不懂呢
##1
def sum_even(n,m):
lst=range(2,(2*n+2),2)
#print lst
x=n%m
y=n/m
#print x,y
s=[]
if x==0:
for i in range(1,y+1):
s.append(sum(lst[((i-1)*m):i*m])/m)
#print s
else:
for i in range(1,x+1):
for j in range(1,i+1):
s.append(sum(lst[(j-1):(j*m)])/m)
#print s
s1=sum(lst[(len(lst)-y):])/y
#print s1
s.append(s1)
return s
print sum_even(3,2)
print sum_even(4,2)
##2 大鲍写的
def average(l):
return sum(l)/len(l)
def sum_even(n,m):
start=2
current_num=start
while n>m:
l=range(current_num,current_num+2*m-1,2)
print average(l),
n=n-m
current_num+=2*m
if n>0:
l=range(current_num,current_num+2*n-1,2)
print average(l),
print
sum_even(3,2)
sum_even(4,2)
2016数据的交换输出
这道题开始问题出现在find_min的min初始化上,我并没有初始化,而是想取i,j两个变量同时遍历list,比较,结果报错,在网上参考了别人的,写出来的,所以说还是不熟练,基础功不扎实。
#encoding:utf8
#数据的交换输出
##思路:先找到最小的数,再做替换
def find_min(l):
min=l[1]
for i in range(1,len(l)):
if min>=l[i]:
min=i
return min
#print find_min([4,2,1,3,4])
def change(l):
if l[0]==0:
return None
else:
temp=l[find_min(l)]
# print temp
l[find_min(l)]=l[1]
# print l[find_min(l)]
l[1]=temp
# print l[1]
print l[1:]
change([4,2,1,3,4])
change([5,5,4,3,2,1])
change([0])
2017字符串统计
#encoding:utf8
#字符串统计
#思路:先将字符串中的元素均用ASCII码表示,判断其ASCII码在48~57之间的但是数字
#这道题一开始想得很简单,想着直接用type找到list里的int不就行了,结果我忘了,当字符串以列表形式
#表示的时候数字也是str形式,所以统计数为0,后来想到可区分str和int应该就是用ASCII了
def is_num(s):
l=list(s)
l_asc=[]
for i in l:
l_asc.append(ord(i))
#print l_asc
lst=[]
for j in l_asc:
if j in range(48,59):
lst.append(j)
print len(lst)
is_num('asd3fghjk8496ldorj')
is_num('asdfweirfa1111awef')
2018母牛的故事
这是一道 类似母兔子的故事,也就是fibonacci数列,找到递推关系,就写出来,不过这些母牛真厉害,可以一直生的母牛,公牛哪去了???这代码题编得太迁强了。
#encoding:utf8
#母牛的故事
##思路:这道题有点类似于Fibonacci数列,用递推关系来走,经过分析,其递推公式为:
##f1=1,f2=2,f3=3,f4=4,f(n)=n+f(n-4)
def cow_num(n):
if n==0:
return None
else:
if n in range(1,5):
return n
return n+cow_num(n-4)
print cow_num(2)
print cow_num(4)
print cow_num(5)
print cow_num(6)
print cow_num(0)
2019数列有序
这道题看着很没有技术含量,而且我当时一看觉得哎呀妈呀,这道题太easy了,结果一写出来,各种问题。先是输入是带空格的,这样生成的list再相加,就会把空格加进去,我又想那我把空格去掉吧,结果咋也没弄明白怎么去。后来查了一下可以用split去掉,然后就是题目要求输入0 0 什么都不做,又把我难住了,这个问题到现在我还没有解决,还有输出,输出是啥,输出是一组数用空格分开,但是我的输出是一个list。哎呀!可以循环打印出列表元素啊,这校就是单个数了啊,看看,这有的时候脑子突然开窍拦都拦不住 。明天再改吧~
#encoding:utf8
#数列有序
#这道python做就很简单了,因为python有自带的排序函数,还可将列表相加,这道题的思路就是两个列表相加,然后排序。
#这道题对于输入 0 0就退出,什么都不做不太会表示
#还有这道题的输出还有些疑问,后续再考虑
l1=raw_input().split(' ')
# if l1==['0','0']:
# break #break 会报错
l2=raw_input().split(' ')
s=l1+l2
s=sorted(list(set(s)))
l=[]
for i in s:
l.append(int(i))
print l
以上是关于「学习笔记」3.17代码学习的主要内容,如果未能解决你的问题,请参考以下文章