算医学习

算法学习(十四),算法学习

1.Fibonacci Divisibility

说明:给定一个斐波纳契序列,从0和1开始,

0 1 1 2 3 5 8 13 21 34 ...

给你一些值M,要求找到这个列表中第一个非零元素的索引,它可以被这个M整除,例如,如果给你M=17,答案是9(元素34的索引,34被17整除)。

输入数据:第一行中包含测试用例的数量。

第二行包含被除数M因子(不超过10000)。

答案:应该包含满足要求的斐波那契数列的索引,用空格隔开。

例如:

input data:
3
17 12 61

answer:
9 12 15

测试数据:

18
7429 8478 3001 7204 9300 4803 4429 8703 2475 5778 3750 4126 9226 8926 6450 2327 9376 7579

代码如下:

 1 test_cases = int(input())
 2 test_data = [int(num) for num in input().split()]
 3 
 4 fib = [0, 1]  # 构造fib数列
 5 a, b = 0, 1
 6 while b < 10**10000:
 7     a, b = b, a + b
 8     fib.append(b)
 9 
10 for n in test_data:
11     for m in fib[1:]:
12         if m % n == 0:
13             print(fib.index(m), end=' ')
14             break  # 找到第一个数后,断开
15 
16 输出:72 2844 25 900 300 80 1144 264 300 36 7500 2064 7896 4464 3300 1246 1176 1890 

 

2.Prime Ranges

说明:给定一对素数(如a、b),你要找到它们之间所有素数的总数量,也包括给定的素数。

isPrime(p) = true

    and

a <= p <= b

输入数据:第一行中包含测试对的数量。

下面各行包含一对素数,第一个值总是小于第二个。所有的值都小于300万。

答案:应该包含这些对所指定范围内的素数的数量。

例如:

 input data:
 3
 5 19      # 在 5 和 19 之间的素数,包括 5 和 19 ,总共有6个数
 11 29    # 在 11 和 29 之间的素数,包括11和29,总共6个数
 2 23      # 同样,在 2 和 23 之间有9个素数,包括2和23

 answer:
 6 6 9

测试数据:

28
2528893 2601089
2017817 2070317
1528627 2299489
1988891 2260787
1604737 2311549
2020663 2070317
1739461 2397631
2397631 2528893
1464733 2286293
1325431 1854623
2339933 2447009
2571733 2679031
1545917 1722013
1464733 1504843
2309471 2397631
2469407 2601089
2309471 2447009
2240533 2625247
2578993 2601089
1585481 1737497
2311549 2563007
1570199 2723363
1782211 2629223
1916413 2266921
2095997 2352787
2421593 2497751
2237051 2562613
2562613 2705111

 

代码如下:

test_cases = int(input())

def eladuosai(n): # 厄拉多塞筛法
    l = list(range(1, n+1))
    l[0] = 0
    for i in range(2, n+1):
        if l[i-1] != 0:
            for j in range(i*2, n+1, i):
                l[j-1] = 0
    result = [x for x in l if x != 0]
    return result

prime = eladuosai(3000000)   # 构造个小于300万的素数列表

for _ in range(test_cases):
    data = [int(n) for n in input().split()]
    nums = []
    for i in prime:
        if i <= data[0] < i + 1:   # 找到第一个值对应的索引
            nums.append(prime.index(i))
        elif i <= data[1] < i + 1:  # 找到第二个值对应的索引
            nums.append(prime.index(i) + 1)   
    print((nums[1] - nums[0]), end=' ')   # 两个索引相减得到之间的总数

输出:4914 3610 53294 18681 48817 3417 45272 8905 56897 37035 7272 7269 12294 2840 5968 8951 9311 26140 1500 10583 17037 79161 57996 24080 17532 5153 22116 9674

 

1.Fibonacci
Divisibility 说明:给定一个斐波纳契序列,从0和1开始, 0 1 1 2 3 5 8 13
21 34 … 给你一些值M,要求找到…

标签:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图