Gửi bài giải
Điểm:
2,00 (OI)
Giới hạn thời gian:
0.05s
Giới hạn bộ nhớ:
256M
Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, Pascal, Perl, PHP, PyPy, Python, Ruby, Rust, Scratch, Swift
Cho số thực ~N~, hãy cho biết ~N~ có phải là lũy thừa của ~3~ hay không?
Lưu ý: Trường hợp ~N~ là số thực, kết quả chấp nhận sai số ~\epsilon \le 10^{-15}~
Input
- Dòng đầu tiên ghi số ~N (0 \le N \le 10^{18}).~
Output
- Nếu ~N = 3^k~ (~k~ là số nguyên) thì in ra ~k~, ngược lại thì in ra
NO
.
Sample
Input #1
9
Output #1
2
Input #2
3
Output #2
1
Input #3
16677181699666570
Output #3
NO
Bình luận
Ý tưởng: Cái này mình áp dụng toán, cụ thể là dùng log:
Ví dụ ta có log3(9) = 2. Cái bây giờ ta cần là làm sao để có cái hàm log3 (C++ không có, hoặc do mình không biết :)). Ta sử dụng t/c của hàm log: logc(a) / logc(b) = logb(a) (c nguyên, bất kì). Như vậy ta sẽ có logc(9) / logc(3) = log3(9). Bài làm của mình dùng log10l (long double).
Như vậy tổng quát ta sẽ có: long double k = log10l(n) / log10l(3).
Lúc này ta có 3 trường hợp từ dữ liệu đầu vào:
TH1: n >= 1 => k >= 0 tức là ta chỉ cần check xem k có phải số nguyên dương (0, 1, 2, ...) hay không rồi in ra màn hình k nguyên là được.
TH2: n là số thực (0 < n < 1) => k < 0 mà bài cho n có sai số là -10^15, cho nên ta sẽ phải biểu diễn k có sai số là -10^15 bằng cách sử dụng hàm round làm tròn đến chữ số thập phân thứ 15, k = round(k * 10^16) / 10^16.
TH3: Không thoả mãn, in ra "NO" thôi.
CƯỜNG GIẢ HỌ ĐINH. VẠN CỔ TỐI CƯỜNG
long double n;
Trong lập trình các phép toán như log, căn, mũ,... có mối liên hệ và rất tiện, hay được sử dụng. Các bạn chú ý phần kiến thức đó sẽ dễ dàng giải các bài code liên quan.
CƯỜNG GIẢ HỌ ĐINH. VẠN CỔ TỐI CƯỜNG
Nên cho test mẫu có số thực
chỉnh lại cho ông dùng py3 à haha
Cố lên em, anh được AC rồi
Chỉnh lại time limit với ạ