Python 整数的N进制字符串表示,循环和函数_亲密数,DNA匹配A

这次作业终于碰到需要思考的题目了(呜呜呜

1. DNA匹配A

【问题描述】编写与字符串对象的find方法功能相似的函数find(srcString, substring, start, end),作用是在srcString串的下标start到下标end之间的片段中寻找subString串的第一次出现的位置,返回该位置值;如果没找到,返回-1。
编写程序,输入源串和子串,检验find(someString, substring,start,end)是否正确。

【输入形式】按照somestrig,substring,start,end的顺序输入,各成分之间由空格隔开。Somestring和substring均由A/T/C/G四个字母组成。start和end由自然数构成。
【输出形式】当匹配成功时,输出子串在DNA字符串的位置,以子串第一个字母在DNA字符串中匹配位置的下标;当匹配失败时,输出-1。
【样例输入】ATCGGCGCGGCGT CGG 0 10
【样例输出】2
【样例说明】下标从0开始计数。

看到这道题目到时候就笑了,这不是Leetcode上的那道实现strStr()嘛,我还写过题解,其实这题应该是一题KMP问题,但是我还是暴力解了一下。
代码如下:

string = input().split(" ")
# print(string)
somestring = string[0]
substring = string[1]
start = int(string[2])
end = int(string[3])
#['ATGATGGAGGTACCCCA', 'GGA', '0', '10']
#['ATCGGCGCGGCGT', 'CGG', '0', '10']
#['TGGATGCGTAGTAAAA', 'GAG', '0', '5']
somestring = somestring[start:end]
if substring not in somestring:
    print("none")
else:
    for i in range(len(somestring)):
        if somestring[i:i+len(substring)] == substring:
            print(i, end = ",")

2. 亲密数

【问题描述】

求整数n以内(含n)的全部亲密数。

说明:如果正整数A的全部因子(包括1,不包括A本身)之和

等于B;且正整数B的全部因子(包括1,不包括B本身)

之和等于A,则将正整数A和B称为亲密数。

1不和其他数形成亲密数。

【输入形式】

输入整数n
【输出形式】

每一行输出一对亲密数,中间用一个空格隔开。

每一对亲密数只输出一次,小的在前。

各对亲密数按序排序,按亲密数中小的那个数从小到大排序。

【样例输入】

3000

【样例输出】

220 284

1184 1210

2620 2924

这题其实也很简单,我按照素数筛的思路,也做了一次筛法打表(虽然交题目的平台上感觉时间复杂度放的很宽),不过这样做应该算是比较快的做法,代码如下

def dabiao(num_list):
    max_num = 100000000
    for i in range(2,m//2):
        for j in range(2,max_num):
            if i*j <= m:
                num_list[i*j] += i
            else:
                break
    return num_list

def dsort(a,b):
    if b>=a:
        return a,b
    else:
        return b,a
        
m = int(input())
num_list = [1]*(m+1)
num_list = dabiao(num_list)
for i in range(2,m+1):
    try:
        if num_list[num_list[i]] == i and num_list[i] != i:
            a = dsort(num_list[i],i)
            print(a[0],a[1])
            num_list[i] = 1
    except:
        continue

3. 整数的N进制字符串表示

【问题描述】

编写函数itob(n,b),用于把整数n转换成以b为基底的字符串并返回.

编写程序,使用函数itob(n,b)将输入的整数n,转换成字符串s,将s输出。转换后的字符串从最高的非零位开始输出。如果n为负数,则输出的字符串的第一个字符为’-’。b为大于1小于37的任意自然数。当b=2时,输出字符只可能是’0’和’1’;当b=16时,输出字符串中可能含有字符为’0’-‘9’,‘a’-‘f’(字母以小写输出)。b为18时,数码是’0’-‘9’,‘a’-‘h’,其中’a’代表10,'g’代表16, 'h’代表17。又比如,输入n=33,b=17,则输出33的17进制值为"1g"。

【输入形式】输入整数n和b,其中n可以为负数。n和b以空格分隔.
【输出形式】输出转换后的字符串s.
【样例输入】5 2
【样例输出】101
【样例说明】5的二进制就是101

这道题其实我之前写C++的时候写过,逻辑很简单,就是十进制转化为N进制,然后想一下平时是怎么转化的,就是先取余N,然后整除N,这样循环就可以了。但是这题我还是卡了十几分钟(我会说我是因为忘记了python的数字无法像C++一样直接转换为ascii字符然后debug半天吗?),代码如下

def itob(n, b, iterrable):
    issmall_than_zero = False
    if n<0:
        n = -n
        issmall_than_zero = True
    while (n/b):
        j = n%b
        n = n//b
        if j>9:
            j=chr(j+97-10)
        iterrable.append(j)
    return issmall_than_zero

x = input().split(" ")
x[0] = int(x[0])
x[1] = int(x[1])
s = []
# x[1] = int(x[1])
ans = itob(x[0],x[1],s)
if ans:
    print("-",end="")
    for i in range(len(s)-1,-1,-1):
        print(s[i],end="")
else:
    for i in range(len(s)-1,-1,-1):
        print(s[i],end="")

差不多就这么几道题目可以写一下吧,还是感觉python在刷题这一块还是C++用起来方便,而且建议自制力不好的人不要用python刷题,不然根本达不到训练算法的程度,只是全程在调用python给你封装好的语法糖罢了。(悄咪咪吐槽一句,杭电的程序设计课感觉好水啊

posted @ 2019-04-22 20:18  ayang818  阅读(1268)  评论(0编辑  收藏  举报