Nhờ mọi người thông giúp em bài này với ạ

Shirley Kwan

Senior Member
Nhờ mọi người thông giúp em bài này với ạ

Đề bài

Cho số nguyên dương n, nhiệm vụ của bạn là viết hàm xác định xem n có phải là luỹ thừa của 4 hay không.
Ví dụ
  • Với n = 16, đầu ra là isPowerOfFour(16) = true.
    Giải thích: 16 bằng 4^2 nên kết quả của hàm là true.
  • Với n = 7, đầu ra là isPowerOfFour(4) = false.
    Giải thích: 7 không phải là lũy thừa của 4.
Đầu vào/Đầu ra
  • [giới hạn thời gian chạy] 0,5 giây
  • [đầu vào] long n
    [đầu ra] boolean

    Trả về true nếu n là luỹ thừa của 4, ngược lại trả về false.

Em viết bằng Python như vầy:
import math

def isPowerOfFour(n):
if n <= 0 or not isinstance(n, int):
return false
return math.log(n, 4).is_integer()
Submit thì pass không nói gì, vì nó đơn giản và dễ hiểu.

Tuy nhiên có 1 cách giải như vầy:
def isPowerOfFour(n):
while n % 4 == 0 and n > 0:
n /= 4
return n == 1
Vì trong đề bài chỗ này n là số nguyên dương, và không thể chia hết cho 4 == 0 được, nên cái vòng lặp này có đúng logic không ạ.
Theo em thì không cần tính n % 4 = 0 vì nó ko thể bằng 0. Ai gõ đầu em với ạ. Em cảm ơn rất nhiều :sweet_kiss:
 
import time

start = time.time()

def isPowerOfFour(n):
if n <= 0:
return False
while n % 4 == 0:
n /= 4
return n == 1

end = time.time()

print(isPowerOfFour(16)) # True
print(isPowerOfFour(7)) # False

print('Thời gian chạy:', end - start)
:shame:
 
Xét về logic thì đúng
Nhưng computer speed thì n /= 4 có thể dùng đếm và xê dịch bit sang trái
Đưa về nhị phân thì số phù hợp đề bài nó là 1 (00)n
Nên mỗi lần dịch 2 bit và so 2 bit bị dịch ra == 00 ko là được
 
Xét về logic thì đúng
Nhưng computer speed thì n /= 4 có thể dùng đếm và xê dịch bit sang trái
Đưa về nhị phân thì số phù hợp đề bài nó là 1 (00)n
Nên mỗi lần dịch 2 bit và so 2 bit bị dịch ra == 00 ko là được
Cái mình muốn hỏi là tại sao trong vòng lặp while lại có cái n % 4 == 0 và n > 0:
Logic nào để đưa cái này vào vòng lặp ạ. Vì ko có số nguyên dương n chia hết cho 4 = 0
 
Mới nghĩ cách giải vầy, bạn làm thử có đúng ko
1. Chuyển số về hệ nhị phân
2. Số lũy thừa 4 sẽ có dạng 1(0n) với n chia hết cho 2.
Ví dụ 1 = 1 là 4^0
4 = 100 là 4^1
16 = 10000 là 4^2
Cứ số nào sang nhị phân thỏa điều kiện 1000000... và n chia hết cho 2 là lũy thừa của 4 :)
 
Cái mình muốn hỏi là tại sao trong vòng lặp while lại có cái n % 4 == 0 và n > 0:
Logic nào để đưa cái này vào vòng lặp ạ. Vì ko có số nguyên dương n chia hết cho 4 = 0
n % 4 là chia lấy dư
n > 0 vì n = 0 thì nó vẫn chia hết cho 4 nhưng ko phải lũy thừa cơ số 4
 
Back
Top