问题
在一平面直角坐标系上小云兮在遛狗狗,一开始的运动方向为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)
小结
只是大概编了一下,思路直接,未经过缜密的思考和优化,期待优化。