Skip to content

Commit 6eda8d0

Browse files
committed
Upload the solutions to Lesson 11.
1 parent 3ee4d4b commit 6eda8d0

4 files changed

Lines changed: 165 additions & 0 deletions

File tree

11-Sieve_cckao.pdf

405 KB
Binary file not shown.

CountNonDivisible.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# you can write to stdout for debugging purposes, e.g.
2+
# print("this is a debug message")
3+
4+
import math
5+
6+
def solution(A):
7+
8+
# count the elements of A (by using dictionary)
9+
my_dictionary_1 = {}
10+
for item in A:
11+
if item not in my_dictionary_1:
12+
my_dictionary_1[item] = 1
13+
else:
14+
my_dictionary_1[item] += 1
15+
# print(my_dictionary_1)
16+
17+
# count the number of non-divisors (into dictionary_2)
18+
my_dictionary_2 = {}
19+
for item in my_dictionary_1:
20+
num_divisor = 0
21+
item_sqrt = math.floor(math.sqrt(item))
22+
# print( str(item) + ' , ' + str(item_sqrt) )
23+
for i in range(1, item_sqrt+1, 1):
24+
if (item % i ==0):
25+
another_divisor = item / i
26+
27+
if i in my_dictionary_1:
28+
num_divisor = num_divisor + my_dictionary_1[i]
29+
30+
if another_divisor != i:
31+
if another_divisor in my_dictionary_1:
32+
num_divisor = num_divisor + my_dictionary_1[another_divisor]
33+
34+
num_non_divisor = len(A) - num_divisor
35+
my_dictionary_2[item] = num_non_divisor
36+
# print(my_dictionary_2)
37+
38+
# put the number of non-divisors into an 'array' (by using list)
39+
array_non_divisor = []
40+
for i in range( len(A) ):
41+
array_non_divisor.append( my_dictionary_2[A[i]] )
42+
43+
return array_non_divisor
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# you can write to stdout for debugging purposes, e.g.
2+
# print("this is a debug message")
3+
4+
import math
5+
6+
def solution(N, P, Q):
7+
# write your code in Python 3.6
8+
9+
# 1
10+
# find primes: use 'Sieve of Eratosthenes'
11+
prime_list_boolean = [True] * (N+1) # note: plus one for "0"
12+
prime_list_boolean[0] = False
13+
prime_list_boolean[1] = False
14+
for i in range( 2, math.floor(math.sqrt(N))+1 ):
15+
if prime_list_boolean[i] == True:
16+
j = i + i
17+
for not_prime in range( j, N+1, i ):
18+
prime_list_boolean[not_prime] = False
19+
20+
# 2
21+
# append 'prime' to list
22+
prime_list = []
23+
for index in range( N+1 ):
24+
if prime_list_boolean[index] == True:
25+
prime_list.append(index)
26+
# print(prime_list)
27+
28+
# 3
29+
# find semi-primes
30+
semiprime_list_boolean = [False] * (N+1) # note: plus one for "0"
31+
for i in range( len(prime_list) ):
32+
for j in range(i, len(prime_list), 1):
33+
semiprime_temp = prime_list[i] * prime_list[j]
34+
if semiprime_temp > N:
35+
break
36+
else:
37+
semiprime_list_boolean[semiprime_temp] = True
38+
39+
# 4
40+
# count the number of semi-primes
41+
count_semiprime_list = [0] * (N+1)
42+
num_semiprime_so_far = 0
43+
for i in range(N+1):
44+
if semiprime_list_boolean[i]==True:
45+
num_semiprime_so_far += 1
46+
count_semiprime_list[i] = num_semiprime_so_far
47+
#print(count_semiprime_list)
48+
49+
# 5
50+
# return answers to all the queries
51+
answer_list = [0] * len(P)
52+
for i in range( len(P) ):
53+
begin_value = P[i]
54+
end_value = Q[i]
55+
#print(count_semiprime_list[end_value])
56+
#print(count_semiprime_list[begin_value])
57+
# be very careful about the 'begin_value' (not included)
58+
answer_list[i] = count_semiprime_list[end_value] - count_semiprime_list[ (begin_value-1) ]
59+
#print(answer_list)
60+
61+
return answer_list

CountSemiprimes_low_performance.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# you can write to stdout for debugging purposes, e.g.
2+
# print("this is a debug message")
3+
4+
import math
5+
6+
def solution(N, P, Q):
7+
# write your code in Python 3.6
8+
9+
# 1
10+
# find primes: use 'Sieve of Eratosthenes'
11+
prime_list = []
12+
# put all values
13+
# be careful about the range
14+
for index in range( 2, N+1 ):
15+
prime_list.append(index)
16+
#print(prime_list)
17+
18+
# 2
19+
# remove 'not prime'
20+
# be careful about the range
21+
for item in range( 2, math.floor(math.sqrt(N))+1 ):
22+
not_prime_first = item + item
23+
for not_prime in range( not_prime_first, N+1, item ):
24+
if not_prime in prime_list:
25+
prime_list.remove(not_prime)
26+
#print(prime_list)
27+
28+
# 3
29+
# find semi-primes
30+
semiprime_list = []
31+
for i in range( len(prime_list) ):
32+
for j in range( i, len(prime_list) ):
33+
semiprime = prime_list[i] * prime_list[j]
34+
if semiprime <= N:
35+
semiprime_list.append(semiprime)
36+
semiprime_list.sort()
37+
#print(semiprime_list)
38+
39+
# 4
40+
# count the number of semi-primes
41+
count_semiprime_list = [0] * (N+1)
42+
num_semiprime_so_far = 0
43+
for i in range(N+1):
44+
if i in semiprime_list:
45+
num_semiprime_so_far += 1
46+
count_semiprime_list[i] = num_semiprime_so_far
47+
#print(count_semiprime_list)
48+
49+
# 5
50+
# return answers to all the queries
51+
answer_list = [0] * len(P)
52+
for i in range( len(P) ):
53+
begin_value = P[i]
54+
end_value = Q[i]
55+
#print(count_semiprime_list[end_value])
56+
#print(count_semiprime_list[begin_value])
57+
# be very careful about the 'begin_value' (not included)
58+
answer_list[i] = count_semiprime_list[end_value] - count_semiprime_list[ (begin_value-1) ]
59+
#print(answer_list)
60+
61+
return answer_list

0 commit comments

Comments
 (0)