Mình post bài viết này lên trong khi thật sự mình chưa tìm ra lời giải tối ưu. Đây là đề:
Tạm dịch: Bạn nhập vào một số nguyên n và tính giá trị của . Và nhiệm vụ là bạn hãy xuất ra số đầu tiên của chữ số kết quả.
Ví dụ: Nhập n = 13
Tính 13¹³ = 302875106592253
Giá trị cần xuất là 3.
Đây là đoạn mã Javascript của mình:
1 2 3 4 5 6 7 8 9 | function firstDigit(n) { var a = 1; for(i=1;i<=n;i++){ a = a * n; } a = a.toString(); var b = parseInt(a[0]); return b; } |
Đầu tiên mình sẽ tính giá trị sau đó đổi kết quả thành kiểu chữ sau đó lấy giá trị đầu tiên rồi trả lại nó về kiểu số. Với cách giải quyết thế này mình nghĩ là OK. Tuy nhiên có 1 điều vướng phải là vòng for tính giá trị mũ chỉ phù hợp với các giá trị nhỏ. Với các giá trị lớn thì bị lỗi vì kết quả vượt quá định mức.
Bạn nào có cách giải quyết tối ưu xin chia sẻ cho mình với nhé.
Huỳnh Mai Anh Kiệt
Cập nhật lời giải chính xác:
Javascript:
1 2 3 4 | function firstDigit(n) { with(Math) return pow(10, n*log(n)/LN10%1) | 0 } |
C++:
1 2 3 | int firstDigit(int n) { return (int)Math.pow(10,n*Math.log10(n) % 1 ); } |