「学习笔记」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

你可能感兴趣的:(python,acmcoder)