鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: ooxx7788

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

[复制链接]
发表于 2018-12-4 19:54:07 | 显示全部楼层
import random as r

# 随机生成n个整数
def createNums(num_l,n):
    for i in range(n):
        num = r.randint(2,50)
        num_l.append(num)
    return num_l

# 循环一次后的结果
def circu(num_l):
    length = len(num_l)   
    a = num_l[0]
    for i in range(length-1):   
        num_l[i] += num_l[i+1]
        if num_l[i] > 100:
            num_l[i] %= 100
    num_l[-1] += a            
    if num_l[-1] > 100:
        num_l[-1] %= 100
    return num_l

# 循环k次后的结果
def circulation(num_l,k):   
    for i in range(k):
        circu(num_l)
    return num_l


num_list = []
n = int(input("请输入要生成整数的个数(2<=n<=50): "))
k = int(input("请输入要循环的次数(1<=k<=20000000): "))
createNums(num_list,n)
print(num_list)
circulation(num_list,k)
print(num_list)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-4 13:39:41 | 显示全部楼层
  1. import random
  2. import time


  3. def make_arr(n):
  4.     arr = []
  5.     for i in range(n):
  6.         arr.append(random.randint(0, 99))

  7.     return arr


  8. def magic(n, k):
  9.     # arr = [1, 2, 3, 4, 5]
  10.     arr = make_arr(n)
  11.     print(arr)
  12.     for i in range(k):
  13.         # print(arr)
  14.         temp = arr[0]
  15.         for j in range(n - 1):
  16.             arr[j] = (arr[j] + arr[j + 1]) % 100
  17.         arr[n - 1] = (arr[n - 1] + temp) % 100

  18.     return arr


  19. begin = time.time()
  20. arr = magic(50, 20000000)
  21. print(arr)
  22. print(time.time() - begin)
复制代码



结果为:
  1. [77, 95, 87, 16, 65, 34, 33, 22, 11, 77, 39, 96, 41, 9, 30, 70, 53, 90, 91, 58, 92, 70, 87, 88, 87, 20, 10, 27, 44, 90, 12, 74, 12, 51, 42, 55, 72, 39, 55, 54, 58, 68, 35, 31, 12, 64, 71, 96, 49, 61]
  2. [86, 40, 7, 30, 15, 23, 16, 92, 81, 97, 72, 84, 65, 7, 17, 64, 73, 75, 61, 60, 28, 8, 4, 31, 74, 11, 90, 7, 5, 40, 48, 91, 67, 56, 72, 22, 34, 65, 82, 67, 89, 48, 50, 36, 10, 53, 33, 79, 81, 74]
  3. 99.58436131477356
复制代码


不知道程序有没有哪里不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-16 10:08:35 | 显示全部楼层
import random as rd
molihuan=[]
len_num=int(input("请输入一个正整数作为魔力环序列:"))
for i in range(len_num):
    molihuan.append(int(rd.uniform(2,50)))

print(molihuan)
for i in range(20000000):
    for j in range(len_num-1):
        molihuan[j]+=molihuan[j+1]
        if molihuan[j]>100:
            molihuan[j]=molihuan[j]%100
    molihuan[-1]+=molihuan[0]
    if molihuan[-1]>100:
        molihuan[-1]=molihuan[-1]%100
    if i % 500000 ==0:
        print(i)
print(molihuan)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-16 10:14:31 | 显示全部楼层
ooxx7788 发表于 2017-3-26 18:59
其实基本的算法我也弄出来了,但是不能满足2000万次的需求。
各位不妨试试看n=50,k=20000000,能不能算。

我的版本这个程序跑起来是2分半
import random as rd
molihuan=[]
len_num=int(input("请输入一个正整数作为魔力环序列:"))
for i in range(len_num):
    molihuan.append(int(rd.uniform(2,50)))

print(molihuan)
for i in range(20000000):
    for j in range(len_num-1):
        molihuan[j]+=molihuan[j+1]
        if molihuan[j]>100:
            molihuan[j]=molihuan[j]%100
    molihuan[-1]+=molihuan[0]
    if molihuan[-1]>100:
        molihuan[-1]=molihuan[-1]%100
    if i % 500000 ==0:
        print(i)
print(molihuan)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-18 21:09:39 From FishC Mobile | 显示全部楼层
jerryxjr1220 发表于 2017-3-26 19:35
题目本身没难度,只是当n=50, k=20000000的时候,运算慢了一些,不过也还行,就几分钟
举例,当n ...

大哥,我想问一下你代码中的self.rings[j]+=self.ring[j+1]不是会有溢出的可能吗,但问什么代码不会报错呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-27 21:06:46 | 显示全部楼层
速度很慢

import random
l = [random.randint(0, 99) for i in range(50)]
k = int(input('请输入循环次数:'))
print(l)

for i in range(k):
    temp = l[0]
    for j in range(len(l)):
        if j == len(l) - 1:
            l[j] = l[j] + temp
        else:
            l[j] = l[j] + l[j+1]
        if l[j] >= 100:
            l[j] = l[j] % 100
print(l)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-11 23:43:58 | 显示全部楼层
交作业!
  1. n = int(input("请输入手环数字n(2-50之间):"))
  2. k = int(input("循环次数k(1-20000000之间):"))
  3. str1 = input('请输入{}个0-9的整数(以逗号“,”分隔)'.format(n))
  4. list1 = [int(each) for each in str1.split(",")]                     #将输入n个数转化为列表
  5. count = 0                                                           #计数器初始化
  6. print("第{}次变化后的数列{}".format(count, list1))                   #打印初始值
  7. while count < k:
  8.     for i in range(n):
  9.         if count == k:                                              #增加断点检测,防止计数器超出设定
  10.             break
  11.         else:
  12.             count += 1
  13.             if i < n-1:                                             #第1到n-1个数字变换
  14.                 if list1[i] + list1[i+1] <= 100:                    #超过100取模
  15.                     list1[i] += list1[i+1]
  16.                 else:
  17.                     list1[i] = (list1[i] + list1[i+1]) % 100
  18.                 print("第{}次变化后的数列{},正在变换第{}个数".format(count, list1,i+1))
  19.             else:
  20.                 if list1[i] + list1[0] <= 100:                      #第n个数字变换
  21.                     list1[i] += list1[0]
  22.                 else:
  23.                     list1[i] = (list1[i] + list1[0]) % 100
  24.                 print("第{}次变化后的数列{},正在变换第{}个数".format(count, list1,i+1))
  25. print("变换第{}次的数值为:{}".format(k, list1[i]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-25 20:16:05 | 显示全部楼层
~~
  1. import datetime as dt

  2. class Band:
  3.           def __init__(self,n,k):
  4.                     self.n = n
  5.                     self.dic={}
  6.                     for  i in range(1,n+1):
  7.                               self.dic[i] = i
  8.                     t = k-1
  9.                     while t:
  10.                               self.newdic()
  11.                               t -=1
  12.                     self.last_dic = self.newdic()
  13.                     last_list = []
  14.                     for a in self.last_dic:
  15.                               last_list.append(str(self.last_dic[a]))
  16.                     print(last_list)
  17.           def newdic(self):
  18.                     dic1 = {}
  19.                     for i in self.dic:
  20.                               dic1[i] = self.dic[i]
  21.                     for a in self.dic:
  22.                               if a == len(self.dic):
  23.                                         self.dic[a] = dic1[a] + dic1[1]
  24.                               else:
  25.                                         self.dic[a] = dic1[a] + dic1[a+1]
  26.                               if self.dic[a] >= 100:
  27.                                         self.dic[a] = self.dic[a]%100
  28.                     return self.dic
  29.                     
  30.                               
  31. def main():
  32.           t1 = dt.datetime.now()
  33.           n = int(input('请输入n的个数:'))
  34.           k = int(input('请输入循环次数:'))
  35.           exp = Band(n,k)
  36.           t2 = dt.datetime.now()
  37.           temp = t2 - t1
  38.           print(temp)

  39.          

  40. if __name__ == '__main__':
  41.          
  42.           main()
  43.                                        

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-25 22:46:48 | 显示全部楼层
本帖最后由 暮让 于 2019-9-25 22:49 编辑
  1. import datetime
  2. import random

  3. n, k = input("请输入n 和 k:").split(' ')
  4. n, k = int(n), int(k)
  5. temp = int(input("请选择导入数据方式:\n1.系统随机\n2.手动输入\n请选择:"))
  6. list1 = []
  7. if temp == 1:
  8.     for i in range(n):
  9.         list1.append(random.randint(0, 99))
  10. elif temp == 2:
  11.     array = input("请输入%d个数字:" % n).split(' ')
  12.     for i in array:
  13.         list1.append(int(i))
  14. print("您导入的数据为:", list1)
  15. t1 = datetime.datetime.now()
  16. for _ in range(k):
  17.     a = list1[0]
  18.     for i in range(n):
  19.         if list1[i-1] > 100:
  20.             list1[i-1] %= 100
  21.         if i == len(list1) - 1:
  22.             list1[i] += a
  23.             if list1[i] > 100:
  24.                 list1[i] %= 100
  25.             break
  26.         list1[i] += list1[i+1]
  27. t2 = datetime.datetime.now()
  28. print(list1)
  29. print(t2-t1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-26 08:52:20 | 显示全部楼层
import time
def fun13():
    Tstart = time.time()
    Lnew = []
    L = [0,1,2,3,4]
    Counttimes = int(input("please enter the number you want to count:"))
    for i in range(Counttimes):
        for j in range(len(L)):
            if(j==(len(L)-1)):
                Lnew.append(Lnew[0])
            else:
                Lnew.append(L[j]+L[j+1])
                if(Lnew[j]>100):
                    Lnew[j] = Lnew[j]%100
        L = []
        L = Lnew
        Lnew = []
        print(L,(time.time()-Tstart),i) #每次显示结果,时间,次数。2百万次大概需要750s.在shell下运行要慢很多。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 10:10:24 | 显示全部楼层
  1. n = int(input("请输入魔力手环有几个数字构成:"))
  2. A = [int(input("魔力手环的数字:")) for i in range(n)]
  3. def status(k):
  4.     # 转了多少圈
  5.     cir = k//n + 1
  6.     # B = []
  7.     # # 生成的新列表
  8.     # for i in range(cir):
  9.     #     B += A
  10.     for i in range(k):
  11.         # 转一次的状态
  12.         # 用B来记录新的状态中的各数字
  13.         B = []
  14.         for j in range(len(A)):
  15.             if j == 0:
  16.                 B.append((A[j]+A[-1])%100)
  17.             else:
  18.                 B.append((A[j]+A[j-1])%100)
  19.         # 更新A,将A中的元素变为转换之后的元素
  20.         for m in range(len(B)):
  21.             A[m] = B[m]
  22.     return A
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 17:14:00 | 显示全部楼层
  1. print('----------每日练习题13----------')
  2. #一个由n个数字构成的环,每次变化后,每个数字会变成自己和后面一个数的和,最后一个数的后面是第一个数。
  3. #当数字大于100时,取模。
  4. #给出这个手环开始的n个数字,循环次数k,循环后的数值。
  5. #要求 2<=n<=50, 1<=k<=20000000;
  6. #注意,一定使得运算可以满足以上n,k的要求(所以,不要认为一个小数字你可以算出来,大数字就一定能算的出来,尽量让计算在有限的时间内完成)。

  7. import random as rd
  8. import time as t

  9. start = t.process_time()

  10. n = int(input('Please input n:'))
  11. k = int(input('Please input k:'))

  12. list1 = []
  13. for i in range(n):
  14.     list1.append(rd.randint(0,99))
  15. print(list1)

  16. count = 0
  17. while count != k:
  18.     list2 = []
  19.     for i in range(len(list1)-1):
  20.         if list1[i] + list1[i+1] >= 100:
  21.             list2.append((list1[i] + list1[i+1]) % 100)
  22.         else:
  23.             list2.append(list1[i] + list1[i+1])
  24.     list2.append(list1[0])
  25.     list1 = []
  26.     list1 = list2
  27.     #print(list2)
  28.     count += 1

  29. print(list2)

  30. end = t.process_time()
  31. t = end - start
  32. print('Runtime is %f s:'%t)
复制代码

  1. ----------每日练习题13----------
  2. Please input n:50
  3. Please input k:20000000
  4. [54, 59, 54, 25, 56, 18, 32, 66, 63, 94, 90, 87, 29, 89, 67, 45, 14, 35, 78, 29, 44, 9, 54, 71, 13, 32, 48, 82, 83, 12, 31, 3, 65, 99, 52, 35, 77, 14, 95, 71, 99, 21, 62, 18, 73, 36, 34, 74, 25, 53]
  5. [93, 6, 5, 14, 22, 94, 45, 90, 58, 69, 95, 65, 82, 27, 24, 16, 51, 89, 85, 97, 0, 29, 40, 45, 46, 73, 88, 49, 60, 21, 13, 41, 9, 24, 78, 10, 90, 79, 92, 92, 75, 12, 80, 65, 10, 52, 92, 59, 9, 3]
  6. Runtime is 831.984375 s:
复制代码


用时10分多钟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 17:09:26 | 显示全部楼层
  1. a = []
  2. n = int(input("你想让这个环有几个数字呢?"))
  3. for i in range(0,n):
  4.     k = int(input("请输入第"+str(i+1)+"个数字(输入的数字应该小于100)"))
  5.     a.append(k)
  6. k = int(input("你想让这个环循环几次呢?"))
  7. for t in range(0,k):
  8.     for i in range(0,n-1):
  9.         if i==0:
  10.             j = (a[0])%100
  11.         a[i] = (a[i] + a[i+1])%100
  12.     a[n-1] = (a[n-1] + j)%100
  13. print(a)
  14. print("运算完成!")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-7 12:27:49 | 显示全部楼层
  1. n = int(input("请输入一个从2到50范围的整数:"))
  2. k = int(input("请输入一个从1到2000000000范围的整数:"))
  3. temp = input("请输入n个数,n是您输入的第一个整数,数之间用空格隔开:")
  4. magic_list = temp.split()

  5. for i in range(n):
  6.     magic_list[i] = int(magic_list[i])


  7. i = 1
  8. j = 0
  9. while i <= k:
  10.     p = magic_list[0]
  11.     while j < n-1:
  12.         magic_list[j] = magic_list[j] + magic_list[j+1]
  13.         if magic_list[j] >= 100:
  14.             magic_list[j] %= 100
  15.         j += 1
  16.     else:
  17.         magic_list[j] = magic_list[j] + p
  18.         if magic_list[j] >= 100:
  19.             magic_list[j] %= 100
  20.         p = magic_list[0]
  21.         i += 1
  22.         j = 0


  23. print(magic_list)
  24.         
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-13 21:15:35 | 显示全部楼层
import random as r
cycle1=[]
times1=0
for num in range(r.randint(2, 50)):
    times1+=1
    cycle1.append(r.randint(0, 99))
print(cycle1)
K=r.randint(1,20000000)
print(K)
while K>0:
    location1=0
    cycle2=[]
    for num_2 in cycle1:
        if location1+1==len(cycle1):
            num_2=num_2+cycle1[0]
        else:
            num_2=num_2+cycle1[location1+1]
        location1+=1
        cycle2.append(num_2)
    K-=1
print(cycle2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-13 22:15:59 From FishC Mobile | 显示全部楼层
新人报到进来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 13:59:43 | 显示全部楼层
  1. num = [int(i) for i in (input()).split(' ')]
  2. num = [i for i in range(1,51)]
  3. n = int(input())
  4. def jisuan(num,n):
  5.     for i in range(n):
  6.         temp = num[0]
  7.         for i in range(len(num)):
  8.             try:
  9.                 num[i]+=num[i+1]
  10.                 if num[i] > 100:
  11.                     num[i] =num[i] - 100
  12.             except:
  13.                 num[i]+=temp
  14.                 if num[i] > 100:
  15.                     num[i] =num[i] - 100
  16.     return num



  17. print(jisuan(num,n))

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 01:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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