这题刚开始能做出正确答案,但是在oj上总是提交通不过,提示:程序异常,exit code 非0;后来检查了一下,按照题目输出格式修改,并且加了异常处理模块顺利通过
题目内容:
定义一个 prime() 函数求整数 n 以内(不包括n)的所有素数(1不是素数),并返回一个按照升序排列的素数列表。使用递归来实现一个二分查找算法函数bi_search(),该函数实现检索任意一个整数在 prime() 函数生成的素数列表中位置(索引)的功能,并返回该位置的索引值,若该数不存在则返回 -1。
输入格式:
第一行为正整数 n
接下来若干行为待查找的数字,每行输入一个数字
输出格式:
每行输出相应的待查找数字的索引值
输入样例:
10
2
4
6
7
输出样例:
0
-1
-1
3
lst=[];
def prime(num):
for i in range(2,num):
if num%i == 0:
return False
return True
def bi_search(lst,m):
low=0
up=len(lst)-1
while low<=up:
mid=(low+up)/2
if lst[mid]<m:
low= mid+1
elif lst[mid]==m:
return mid
else:
up=mid-1
return -1
n=int(raw_input());
for i in range(2,n+1):
if prime(i):
lst.append(i)
lst2=[]
m=int(raw_input())
lst2.append(m)
while m!='':
try:
m=int(raw_input())
lst2.append(m)
except:
break
for i in lst2:
print bi_search(lst,i)
题目要求用递归二分法,但是循环也通过了,在题目给定范围的数字内素数一个列表,之后输进来检索的存入另一个,之后调用函数逐个输出结果即可
二分法用递归方法只通过了例一,应该是一些特殊数据没有考虑到,后续通过后,会贴出来,希望看到的朋友能分享一下正确的代码
lst=[];
def prime(num):
for i in range(2,num):
if num%i == 0:
return False
return True
def bi_search(lst,m,start,end):
if m<0 or end==0:
return -1
elif start>end:
return -1
mid=int(start+(end-start)/2)
if lst[mid]==m:
return mid;
elif m<lst[mid]:
return bi_search(lst,m,start,mid-1)
else:
return bi_search(lst,m,mid+1,end)
n=int(raw_input());
for i in range(2,n+1):
if prime(i):
lst.append(i)
lst2=[]
m=int(raw_input())
lst2.append(m)
while m!='':
try:
m=int(raw_input())
lst2.append(m)
except:
break
lenth=len(lst)
for i in lst2:
print bi_search(lst,i,0,lenth)