素数转圈问题1.0

       问题

        在一平面直角坐标系上小云兮在遛狗狗,一开始的运动方向为x轴正方向。现记其走过的总路程为x,当x为素数时,遛狗的前进方向顺时针旋转90度。现问当x等于某一定值时,其在x轴或y轴方向上所达到的最遥远两端的距离。

       整体思路

        拿到这个问题的第一想法拆解模块,基本有四个步骤:一是要收集x以内的素数;二是计算每段的长度;三是要判断最值;四是要区分四个运动方向。

       第一步:收集x以内的素数

        首先的第一步是收集素数,这很简单,把有大于等于2以上因数的舍去,剩下的收集到一个列表list1中去即可,代码如下:

def is_prime(num,list):
    #判断素数并收集到list
    if num==0 or num==1:
        return()
    for factor in range(2,num):
        if num%factor==0:
            return()
    list.append(num)
    return()

        第二步:计算每段的长度

        这也很简单,在原列表list1中的数据之前填上一个0转入list2中,用list1中的数据逐项与list2中相对应的数据相减并收集到一个新的列表delta_list中即可,代码如下:

def delta_lists(n,list1,list2,delta_list):
    #两个列表中数据逐项做差,并收集到delta_list
    for factor in range(n):
        m=list1[factor]-list2[factor]
        delta_list.append(m)
    return()

        第三步:判断最值

        直接判断即可,这里考虑到运动方向的不定性,采用的是max,min分别存储的方式,代码如下:

def extreme_value(max,min,x):
    #极值
    if x >= max:
        max=x
    if x <= min:
        min=x
    return(max,min)

        第四步:区分四个运动方向

        这里采用的是以4为一个周期,对元素在列表中位置的间隔抽取,也就是模4来判断,并且以素数为单位实时更新了最值,代码如下:

def divide_xy_ans(n,delta_list):
    #区分x,y方向位移并计算
    x=0
    y=0
    xmax=0
    xmin=0
    ymax=0
    ymin=0
    for factor in range(n):
        if factor%4==0:
            x+=delta_list[factor]
            xmax,xmin=extreme_value(xmax,xmin,x)
            continue
        elif factor%4==1:
            y-=delta_list[factor]
            ymax,ymin=extreme_value(ymax,ymin,y)
            continue
        elif factor%4==2:
            x-=delta_list[factor]
            xmax,xmin=extreme_value(xmax,xmin,x)
            continue
        elif factor%4==3:
            y+=delta_list[factor]
            ymax,ymin=extreme_value(ymax,ymin,y)
    xans=xmax-xmin
    yans=ymax-ymin
    return(xans,yans)

        代码主体部分

        接下来主体部分按逻辑编程即可,处理好变量、输入和输出,代码如下:

#主体部分
print('问题:在一平面直角坐标系上小云兮在遛狗狗,一开始的运动方向为x轴正方向。\
现记其走过的路程为s,当s为素数时,遛狗的前进方向顺时针旋转90度。\
现问当总路程x等于某一输入值时,其在x轴或y轴方向上所达到的最遥远两端的距离。')
list1=[]
delta_list=[]
num=int(input("请输入移动总路程:"))
if num==0 or num==1 or num==2:
    xans=num
    yans=0
else:
    for factor in range(num):
        is_prime(factor,list1)
    list2=list1.copy()
    list2.insert(0,0)
    n=len(list1)
    delta_lists(n,list1,list2,delta_list)
    if num not in list1:
        delta_list.append(num-list1[n-1])
    n_final=len(delta_list)
    xans,yans=divide_xy_ans(n_final,delta_list)
    ans=max(xans,yans) 
print('水平方向的极差=',xans,'竖直方向的极差=',yans,'最大的极差=',ans)

        全部代码

        整体汇总一下,代码如下:

def is_prime(num,list):
    #判断素数并收集到list
    if num==0 or num==1:
        return()
    for factor in range(2,num):
        if num%factor==0:
            return()
    list.append(num)
    return()



def delta_lists(n,list1,list2,delta_list):
    #两个列表中数据逐项做差,并收集到delta_list
    for factor in range(n):
        m=list1[factor]-list2[factor]
        delta_list.append(m)
    return()



def extreme_value(max,min,x):
    #极值
    if x >= max:
        max=x
    if x <= min:
        min=x
    return(max,min)



def divide_xy_ans(n,delta_list):
    #区分x,y方向位移并计算
    x=0
    y=0
    xmax=0
    xmin=0
    ymax=0
    ymin=0
    for factor in range(n):
        if factor%4==0:
            x+=delta_list[factor]
            xmax,xmin=extreme_value(xmax,xmin,x)
            continue
        elif factor%4==1:
            y-=delta_list[factor]
            ymax,ymin=extreme_value(ymax,ymin,y)
            continue
        elif factor%4==2:
            x-=delta_list[factor]
            xmax,xmin=extreme_value(xmax,xmin,x)
            continue
        elif factor%4==3:
            y+=delta_list[factor]
            ymax,ymin=extreme_value(ymax,ymin,y)
    xans=xmax-xmin
    yans=ymax-ymin
    return(xans,yans)



#主体部分
print('问题:在一平面直角坐标系上小云兮在遛狗狗,一开始的运动方向为x轴正方向。\
现记其走过的路程为s,当s为素数时,遛狗的前进方向顺时针旋转90度。\
现问当总路程x等于某一输入值时,其在x轴或y轴方向上所达到的最遥远两端的距离。')
list1=[]
delta_list=[]
num=int(input("请输入移动总路程:"))
if num==0 or num==1 or num==2:
    xans=num
    yans=0
else:
    for factor in range(num):
        is_prime(factor,list1)
    list2=list1.copy()
    list2.insert(0,0)
    n=len(list1)
    delta_lists(n,list1,list2,delta_list)
    if num not in list1:
        delta_list.append(num-list1[n-1])
    n_final=len(delta_list)
    xans,yans=divide_xy_ans(n_final,delta_list)
    ans=max(xans,yans) 
print('水平方向的极差=',xans,'竖直方向的极差=',yans,'最大的极差=',ans)

        小结

        只是大概编了一下,思路直接,未经过缜密的思考和优化,期待优化。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值