鱼C论坛

 找回密码
 立即注册
楼主: ooxx7788

[技术交流] Python:每日一题 13

[复制链接]
发表于 2017-9-23 15:12:07 | 显示全部楼层
  1. import time , random

  2. m = int(input("Input cycle times:"))
  3. list1=[]
  4. for i in range(50):
  5.     list1.append(random.randint(1,100))


  6. start = time.time()
  7. def change(list1):
  8.    
  9.     n = len(list1)
  10.     list2 = []
  11.     for i in range(n-1):
  12.         list2.append(int(list1[i]) + int(list1[i+1]))
  13.     list2.append(int(list1[-1]) + int(list1[0]))
  14.     for j in range(n):
  15.         if list2[j] >=100:
  16.             list2[j] = list2[j]%100
  17.    
  18.     list1 = list2
  19.     return (list1)

  20. for k in range(m):
  21.     list1 = change(list1)     
  22. print(list1)
  23. end = time.time()
  24. print(end-start)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-28 12:36:04 | 显示全部楼层
本帖最后由 aixuexi82 于 2017-9-28 12:38 编辑

我的垃圾码,最大值跑了好久
  1. n = int(input('请输入构成魔力环的数字个数(2-50之间):'))
  2. k = int(input('请输入需要循环的次数(1-20000000之间):'))
  3. temp = str(input('请输入魔力环中的数字,以空格隔开:'))
  4. mylist = temp.split(' ')
  5. mylist = list(map(eval,mylist))
  6. result = 1

  7. if len(mylist) != n:
  8.     print('输入个数不匹配!')
  9.     result = 0
  10. else:
  11.     for times in range(k):
  12.         first = mylist[0]
  13.         for i in range(n-1):
  14.             mylist[i] += mylist[i+1]
  15.         mylist[n-1] = mylist[n-1] + first
  16.         for j in range(n):
  17.             if mylist[j] >= 100:
  18.                 mylist[j] -= 100

  19. if result:               
  20.     print(mylist)
复制代码

  1. 请输入构成魔力环的数字个数(2-50之间):50
  2. 请输入需要循环的次数(1-20000000之间):20000000
  3. 请输入魔力环中的数字,以空格隔开:1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
  4. [66, 42, 18, 44, 40, 66, 42, 18, 94, 90, 66, 42, 18, 44, 40, 66, 42, 18, 94, 90, 66, 42, 18, 44, 40, 66, 42, 18, 94, 90, 66, 42, 18, 44, 40, 66, 42, 18, 94, 90, 66, 42, 18, 44, 40, 66, 42, 18, 94, 90]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-19 07:56:09 | 显示全部楼层
本帖最后由 yjsx86 于 2018-1-19 07:58 编辑

开始 50 数 循环 20000000 次
代码运行 耗时 3.78 分钟 验证过代码 没问题
  1. import random
  2. from functools import reduce

  3. def func(x, y):
  4.     _sum = x + y
  5.     if _sum > 100:
  6.         _sum = _sum % 100
  7.     temp.append(_sum)
  8.     return y

  9. MagicRing = random.choices([x for x in range(1,101)],k=50)

  10. for x in range(20000000):
  11.     temp = []
  12.     MagicRing.append(MagicRing[0])
  13.     reduce(func, MagicRing)
  14.     MagicRing = temp

  15. print(MagicRing)

  16. # 结果
  17. [41, 36, 60, 41, 98, 5, 71, 94, 81, 28, 85, 27, 1, 32, 7, 78, 2, 84, 72, 27, 67, 15, 6, 76, 36, 66, 36, 35, 91, 23, 30, 71, 19, 56, 78, 60, 2, 51, 82, 7, 78, 52, 34, 47, 27, 92, 40, 31, 76, 86]
  18. Finnished in 229.32459 sec
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-6 14:16:19 | 显示全部楼层
  1. def ml(l,n,k):
  2.     K = 0
  3.     while k>=K:
  4.         l[0]=(l[0]+l[-1])%100
  5.         for i in range(n-1):
  6.             l[i] = (l[i]+l[i+1])%100
  7.         else:
  8.             l[-1]=(l[-1]+l[0])%100
  9.             K+=1
  10.     return l

  11. a= input("n,k= ").split(" ")
  12. n,k =int(a[0]),int(a[1])
  13. l = input("m= ").split(" ")
  14. if n==len(l):
  15.     for i in range(len(l)):
  16.         l[i] = int(l[i])
  17. else:print("error")
  18. if __name__=="__main__":
  19.     print(ml(l,n,k))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-6 19:49:22 | 显示全部楼层
def cycle_add(listn,k):
        while k:
                list1 = listn.copy()
                for i in list1:
                       
                        buf = list1.index(i)
                        if i != list1[-1]:
                                listn[buf] = listn[buf] + listn[buf+1]
                        else:
                                listn[buf] = listn[buf] + list1[0]
                        if abs(listn[buf]) >= 100:
                                listn[buf] = listn[buf] % 100
                k -= 1

        return listn
       
print(cycle_add([2,-5,2,5,7,9,10],101))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 09:58:35 | 显示全部楼层
  1. import random
  2. import time

  3. l = []

  4. for i in range(50):
  5.     l.append(random.randint(1, 100))

  6. print(l)

  7. timestar = time.clock()
  8. for i in range (20000000):
  9.     x = 0
  10.     for i in range(50):
  11.         x += 1
  12.         if x == 50:
  13.             l[i] += l[0]
  14.         else:
  15.             l[i] += l[i + 1]
  16.         if l[i] >100:
  17.             l[i] = l[i] - 100

  18. timeend = time.clock()
  19. print(l)
  20. print ("time is :{}".format(timeend-timestar))
复制代码


次数少还可以,200万次,根本跑不出来.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 16:31:51 | 显示全部楼层
本帖最后由 凌九霄 于 2018-3-29 16:34 编辑
  1. import time,random

  2. n = 50
  3. listone = random.sample([i for i in range(n)],n)
  4. listtwo = []
  5. newlist = []


  6. listtwo = listone[:]
  7. listtwo.append(listone[0])
  8. listtwo.pop(0)

  9. print("初始列表(n={0}):".format(n))
  10. print(listone)

  11. start = time.time()

  12. for k in range(1, 20000001):
  13.     newlist = [(x + y) % 100 for x, y in zip(listone, listtwo)]

  14.     listone = newlist[:]
  15.     listtwo = newlist[:]
  16.     listtwo.append(listtwo[0])
  17.     listtwo.pop(0)
  18. print("\n最终列表(k={0}):".format(k))
  19. print(listone)
  20. end = time.time()
  21. print("\n总计用时:{0:.2f}s".format(end - start))
复制代码


360截图20180329160323882.jpg
360截图20180329163035542.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 10:23:19 | 显示全部楼层
def random_circulation():

    import random

    forn_time = random.randint(6,50)

    fork_time = random.randint(2,2E7)

    list_member = []

    for each in range(0,fork_time):
        
        each_member = random.randint(0,101)

        list_member.append(each_member)


    while(fork_time > 0):
            
            for each_index in (0,len(list_member)-3):

                    list_member[each_index] = list_member[each_index] + \
                                              list_member[each_index+1]

                    if list_member[each_index] > 100:

                        list_member[each_index] %= 100

            list_member[len(list_member)-1] = list_member[0] + \
                                              list_member[len(list_member)-1]
            
            if list_member[len(list_member)-1] > 100:

                    list_member[len(list_member)-1] %= 100
                              
            fork_time -= 1

    return list_member

while(True):
   
    print(random_circulation())

    stop = input('\n按下任意键继续循环。\n')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 11:12:12 | 显示全部楼层
z1446773686 发表于 2018-4-7 10:23
def random_circulation():

    import random

def random_circulation():

    import random

    forn_time = random.randint(2,50)

    fork_time = random.randint(2,2E7)

    list_member = []

    for each in range(0,forn_time):
        
        each_member = random.randint(2,101)

        list_member.append(each_member)

    print(len(list_member),fork_time)

    while(fork_time > 0):
            
            for each_index in (0,len(list_member)-3):

                    list_member[each_index] = list_member[each_index] + \
                                              list_member[each_index+1]

                    if list_member[each_index] > 100:

                        list_member[each_index] %= 100

            list_member[len(list_member)-1] = list_member[0] + \
                                              list_member[len(list_member)-1]
            
            if list_member[len(list_member)-1] > 100:

                    list_member[len(list_member)-1] %= 100
                              
            fork_time -= 1

    return list_member

while(True):
   
    print(random_circulation())

    stop = input('\n按下任意键继续循环。\n')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 18:41:54 | 显示全部楼层
  1. '''
  2. 一个由n个数字构成的环,每次变化后,每个数字会变成自己和后面一个数的和
  3. 最后一个数的后面是第一个数。
  4. 当数字大于100时,取模。
  5. 给出这个手环开始的n个数字,循环次数k,循环后的数值。
  6. 要求 2<=n<=50, 1<=k<=20000000;
  7. 注意,一定使得运算可以满足以上n,k的要求
  8. (所以,不要认为一个小数字你可以算出来,大数字就一定能算的出来,尽量让计算在有限的时间内完成)。
  9. '''
  10. import time
  11. import random
  12. def gameX(n,k):
  13.     #初始化n个数字的环(列表)
  14.     listx=[]
  15.     for i in range(n):
  16.         listx.append(random.randint(1,100))
  17.     #创建一个相应移位的环(列表)
  18.     listy=listx[1:]+[listx[0]]
  19.     print("初始列表为:"+str(listx))
  20.     print("跟随列表为:"+str(listy))
  21.     for i in range(k):
  22.         for j in range(len(listx)):
  23.             listx[j]=listx[j]+listy[j]
  24.             if listx[j]>=100:
  25.                 listx[j]=listx[j]%100
  26.         listy=listx[1:]+[listx[0]]
  27.     return listx

  28. if __name__=='__main__':
  29.     n=int(input("输入数字的数量(n):\n"))
  30.     k=int(input("输入要循环的次数(k):\n"))
  31.     start=time.time()
  32.     print(gameX(n,k))
  33.     end=time.time()
  34.     print("程序运行了%d秒。" %(end-start))
  35.    
  36.         
复制代码

  1. 输入数字的数量(n):
  2. 50
  3. 输入要循环的次数(k):
  4. 20000000
  5. 初始列表为:[35, 83, 1, 78, 26, 97, 84, 52, 23, 46, 96, 19, 81, 73, 68, 51, 52, 5, 68, 4, 40, 71, 99, 33, 6, 27, 43, 24, 41, 62, 64, 21, 32, 56, 81, 31, 4, 39, 23, 90, 11, 48, 1, 36, 98, 14, 83, 68, 75, 73]
  6. 跟随列表为:[83, 1, 78, 26, 97, 84, 52, 23, 46, 96, 19, 81, 73, 68, 51, 52, 5, 68, 4, 40, 71, 99, 33, 6, 27, 43, 24, 41, 62, 64, 21, 32, 56, 81, 31, 4, 39, 23, 90, 11, 48, 1, 36, 98, 14, 83, 68, 75, 73, 35]
  7. [6, 88, 0, 47, 44, 18, 40, 67, 77, 1, 26, 49, 85, 73, 29, 6, 25, 53, 2, 76, 2, 52, 46, 4, 77, 31, 88, 25, 22, 69, 18, 65, 17, 27, 76, 76, 24, 85, 23, 4, 81, 50, 28, 52, 76, 2, 27, 96, 29, 52]
  8. 程序运行了259秒。
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-28 16:27:00 | 显示全部楼层

listone = newlist[:]
listtwo = newlist[:]
listtwo.append(listtwo[0])
listtwo.pop(0)
这里感觉不对呢··但试了最终结果又是对的···
比如初始列表是[0, 3, 2, 4, 1],append之后的listtwo就是 [3, 2, 4, 1, 0],按规则,第一次循环后的结果应该是[1,3,5,6,5],但按你的来就是[3,5,6,5,1]``顺序不对啊···求解释。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-28 16:33:25 | 显示全部楼层
import datetime
print("手环的数字个数n范围:2<=n<=50,循环次数k范围:1<=k<=20000000")
CountNums = input('请输入手环的数字个数n和循环次数k,空格隔开:').split()
print('构成初始手环数字的要求:0到99')
Nums = input('请输入构成手环的每数字,空格隔开:').split()
def strToint(x):
    for i in range(len(x)):
        x[i]=int(x[i])
    return x
CountNums = strToint(CountNums)
Nums =  strToint(Nums)
n = CountNums[0]
k = CountNums[1]
if n!=len(Nums):
    print('初始手环个数为%d,输入个数为%d'%(n,len(Nums)))
    exit()
def loopCase(lists,x):
    for a in range(1,x+1):
        slist=lists[:]
        for b in range(len(lists)):
            if b ==0:
                lists[b]=(slist[b]+slist[-1])%100
            else:
                lists[b]=(slist[b]+slist[b-1])%100
    return lists
start = datetime.datetime.now()
flist = loopCase(Nums,k)
end = datetime.datetime.now()
print(flist)
print(end-start)
结果:
手环的数字个数n范围:2<=n<=50,循环次数k范围:1<=k<=20000000
请输入手环的数字个数n和循环次数k,空格隔开:50 20000000
构成初始手环数字的要求:0到99
请输入构成手环的每数字,空格隔开:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
[26, 2, 28, 4, 30, 6, 82, 58, 34, 10, 86, 62, 38, 14, 40, 16, 42, 18, 44, 20, 96, 72, 48, 24, 0, 76, 52, 28, 4, 80, 56, 32, 58, 34, 60, 36, 62, 38, 14, 90, 66, 42, 18, 94, 70, 46, 72, 48, 74, 50]
0:02:48.658647
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-29 22:29:52 | 显示全部楼层
本帖最后由 小庆子 于 2018-4-29 22:31 编辑
  1. numb = list(int(i) for i in(input('请输入一组数字(用空格隔开):').split(' ')))
  2. n = len(numb)-1
  3. k = int(input('你想循环的次数:'))
  4. def M_Ring(n,k,numb):
  5.     while k > 0:
  6.         temp = numb[0]
  7.         for i in range(0,n+1):
  8.             if i != n:
  9.                 numb[i] = numb[i]+numb[i+1]
  10.                 if numb[i] >100:
  11.                     numb[i] = numb[i] -100
  12.             else:
  13.                 numb[i] = numb[-1] + temp
  14.             if numb[i] >100:
  15.                    numb[i] = numb[i] -100
  16.         k -= 1
  17. M_Ring(n,k,numb)
  18. print(numb)
复制代码



跑2000 0000 太久了- -唉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-1 09:07:59 | 显示全部楼层
jrro452 发表于 2018-4-28 16:27
listone = newlist[:]
listtwo = newlist[:]
listtwo.append(listtwo[0])

按照题目的意思,一个由n个数字构成的环,每次变化后,每个数字会变成自己和后面一个数的和,最后一个数的后面是第一个数。
如果你的初始列表是[0,3,2,4,1],第一轮后就应该是[3,5,6,5,1],没毛病啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-2 14:49:17 | 显示全部楼层
凌九霄 发表于 2018-5-1 09:07
按照题目的意思,一个由n个数字构成的环,每次变化后,每个数字会变成自己和后面一个数的和,最后一个数 ...

你是对的,我没考虑到‘最后一个数的后面是第一个数’这个条件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-9 14:29:47 | 显示全部楼层
  1. n,k = map(int,input('请输入数字个数n(2<=n<=50)和迭代次数k(1<=k<=2000000000)(以空格隔开):').split(' '))
  2. b = list(map(int,input('请输入魔力手环初始数(以空格分隔):').split(' ')))
  3. for i in range(0,k):
  4.     for j in range(0,n):
  5.         if j < (n-1):
  6.             b[j] = (b[j] + b[j+1]) % 100
  7.         else:
  8.             b[j] = (b[j] + b[0]) % 100
  9. print('经过%d次使用后手环状态为:'%k,b)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-30 10:23:26 | 显示全部楼层
import random

x = 0
n = int(input('请输入手环的数字个数:'))
k = int(input('请输入循环次数:'))
j = range(0,99)
temp= random.sample(j ,n)
print('初始数组为:'+ str(temp))
a = len(temp)
temp1 = []
number = 1


while number <= k:
   
    for i in range(0,int(a)):
        x = temp[i] + temp[i-1]
        if x > 100:
            x = x%100
        temp1.append(x)
    temp = temp1[:]
    temp1 = []
   
    print('第%d次循环的数组为:'% number + str(temp))
    number += 1
   


时间运行慢的惨不忍睹。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 14:30:04 | 显示全部楼层
  1. import random
  2. list1 = []
  3. # n,k = map(int,input("请输入魔力手环显示的数字个数和小易使用魔力的次数:").split(','))
  4. n,k = 50,2000000000
  5. print(n,k)
  6. for i in range(n):
  7.     list1.append(random.randint(0,99))
  8. print("魔力手环初始数字为:",list1)
  9. list2 = list1[:]
  10. for j in range(k):
  11.     for i in range(n):
  12.         if i+1 == n:
  13.             list2[i] = list1[i] + list1[0]
  14.         else:
  15.             list2[i] = list1[i] + list1[i+1]
  16.         
  17.         if list2[i] >= 100:
  18.             list2[i] %= 100
  19.     print("魔力手环第%d次使用后显示的数字为:%s" % (j+1,str(list2)),end="\n")
  20.     list1 = list2[:]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-26 18:08:19 | 显示全部楼层
import random as r
str_in = input('用逗号分隔2个正整数:')
lst = [int(n) for n in str_in.split(",")]
n=lst[0]
k=lst[1]
lst=[]
for i in range(n):
    lst.append(r.randint(0,99))
for k in range(k):
    for i in range(n-1):
        lst[i]+=lst[i+1]
        if lst[i]>100:
            lst[i]=lst[i]%100
    lst[-1]+=lst[0]
    if lst[-1]>100:
        lst[-1]=lst[i]%100
print(lst)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-30 17:12:02 | 显示全部楼层
list1 = [1,2,3,4,5]
k = 5
l = len(list1)
while k:
        for i in range(l):
                if i == l-1:
                        list1[i] += list1[0]
                else:
                        list1[i] += list1[i+1]
                if list1[i] >= 100:
                        list1[i] %= 100
        k -= 1
        print(list1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 20:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表