python 第六周第一题

博客讲述了作者在实现prime()函数获取素数列表和递归二分查找算法bi_search()过程中遇到的问题。在oj提交时遇到程序异常,通过调整输出格式和增加异常处理后成功解决。博客提供了输入输出样例,并提到二分法递归在某些特殊数据上未通过,期待解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题刚开始能做出正确答案,但是在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)

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值