1. Giới thiệu
Trong hướng dẫn nhanh này, chúng ta sẽ khám phá các cách khác nhau để có được Number of Digits in an Integer in Java. Chúng tôi cũng sẽ phân tích các phương pháp khác nhau đó và sẽ tìm ra thuật toán nào phù hợp nhất với tình huống của chúng tôi.
2. Số chữ số trong một số nguyên
Đối với các phương pháp được thảo luận ở đây, chúng tôi chỉ xem xét các số nguyên dương. Nếu chúng tôi mong đợi bất kỳ đầu vào tiêu cực nào, thì trước tiên chúng tôi có thể sử dụng Math.abs (số) trước khi sử dụng bất kỳ phương thức nào trong số này.
2.1. Giải pháp dựa trên chuỗi
Có lẽ cách dễ nhất để có được số chữ số trong Số nguyên là chuyển đổi nó thành Chuỗi và gọi phương thức length () . Điều này sẽ trả về độ dài của biểu diễn Chuỗi của số của chúng tôi:
Nếu chúng ta chỉ có một vài con số để đánh giá, thì chúng ta rõ ràng có thể đi với giải pháp này - bởi vì sự khác biệt giữa phương pháp này và bất kỳ phương pháp nào khác sẽ bị bỏ qua ngay cả đối với số lượng lớn.
2.2. Phương pháp tiếp cận logarit
Đối với các số được biểu thị dưới dạng thập phân, nếu chúng ta lấy nhật ký của chúng ở cơ sở 10 và làm tròn nó lên thì chúng ta sẽ nhận được số chữ số trong số đó:
Cách tiếp cận logarit nhanh hơn đáng kể so với cách tiếp cận dựa trên Chuỗi vì nó không phải trải qua quá trình chuyển đổi dữ liệu. Nó chỉ liên quan đến một phép tính đơn giản, đơn giản mà không cần thêm bất kỳ khởi tạo hoặc vòng lặp đối tượng nào.
2.3. Nhân lặp lại
Trong phương pháp này, chúng tôi sẽ lấy một biến tạm thời (được khởi tạo thành 1) và sẽ tiếp tục nhân nó với 10 cho đến khi nó trở nên lớn hơn với số của chúng tôi. Trong quá trình này, chúng tôi cũng sẽ sử dụng biến độ dài sẽ theo dõi độ dài của số:
2.4. Chia rẽ với sức mạnh của hai
Nếu chúng ta biết về phạm vi số của chúng ta, thì chúng ta có thể sử dụng một biến thể sẽ làm giảm hơn nữa sự so sánh của chúng ta. Phương pháp này chia số cho các lũy thừa của hai (ví dụ 1, 2, 4, 8, v.v.):
Phương pháp này chia số cho các lũy thừa của hai (ví dụ 1, 2, 4, 8, v.v.):
Đối với một số gồm 15 chữ số, chúng tôi sẽ thực hiện 15 so sánh theo cách tiếp cận trước đây, chúng tôi đã giảm xuống chỉ còn 4 trong phương pháp này.
2.5. Phân chia và chinh phục
Đây có lẽ là cách tiếp cận mạnh mẽ nhất khi so sánh với tất cả các mô tả khác ở đây, nhưng không cần phải nói, đây là cách nhanh nhất vì chúng tôi không thực hiện bất kỳ loại chuyển đổi, nhân, thêm hoặc khởi tạo đối tượng nào.
Chúng tôi nhận được câu trả lời của chúng tôi chỉ trong vòng ba hoặc bốn đơn giản nếu báo cáo:
3. Kết luận
Trong bài viết ngắn gọn này, chúng tôi đã phác thảo một số cách để tìm số chữ số trong một Số nguyên và chúng tôi đã so sánh hiệu quả của từng phương pháp.
Trong hướng dẫn nhanh này, chúng ta sẽ khám phá các cách khác nhau để có được Number of Digits in an Integer in Java. Chúng tôi cũng sẽ phân tích các phương pháp khác nhau đó và sẽ tìm ra thuật toán nào phù hợp nhất với tình huống của chúng tôi.
2. Số chữ số trong một số nguyên
Đối với các phương pháp được thảo luận ở đây, chúng tôi chỉ xem xét các số nguyên dương. Nếu chúng tôi mong đợi bất kỳ đầu vào tiêu cực nào, thì trước tiên chúng tôi có thể sử dụng Math.abs (số) trước khi sử dụng bất kỳ phương thức nào trong số này.
2.1. Giải pháp dựa trên chuỗi
Có lẽ cách dễ nhất để có được số chữ số trong Số nguyên là chuyển đổi nó thành Chuỗi và gọi phương thức length () . Điều này sẽ trả về độ dài của biểu diễn Chuỗi của số của chúng tôi:
int length = String.valueOf(number).length();Nhưng, đây có thể là một cách tiếp cận tối ưu phụ trong lập trình java, vì tuyên bố này liên quan đến việc cấp phát bộ nhớ cho Chuỗi, cho mỗi đánh giá . Trước tiên, JVM phải phân tích số của chúng tôi và sao chép các chữ số của nó thành một Chuỗi riêng biệt và thực hiện một số hoạt động khác nhau (như giữ các bản sao tạm thời, xử lý chuyển đổi Unicode, v.v.).
Nếu chúng ta chỉ có một vài con số để đánh giá, thì chúng ta rõ ràng có thể đi với giải pháp này - bởi vì sự khác biệt giữa phương pháp này và bất kỳ phương pháp nào khác sẽ bị bỏ qua ngay cả đối với số lượng lớn.
2.2. Phương pháp tiếp cận logarit
Đối với các số được biểu thị dưới dạng thập phân, nếu chúng ta lấy nhật ký của chúng ở cơ sở 10 và làm tròn nó lên thì chúng ta sẽ nhận được số chữ số trong số đó:
int length = (int) (Math.log10(number) + 1);Lưu ý rằng log 10 0 của bất kỳ số nào không được xác định. Vì vậy, nếu chúng tôi mong đợi bất kỳ đầu vào nào có giá trị 0 , thì chúng tôi cũng có thể kiểm tra xem đầu vào đó.
Cách tiếp cận logarit nhanh hơn đáng kể so với cách tiếp cận dựa trên Chuỗi vì nó không phải trải qua quá trình chuyển đổi dữ liệu. Nó chỉ liên quan đến một phép tính đơn giản, đơn giản mà không cần thêm bất kỳ khởi tạo hoặc vòng lặp đối tượng nào.
2.3. Nhân lặp lại
Trong phương pháp này, chúng tôi sẽ lấy một biến tạm thời (được khởi tạo thành 1) và sẽ tiếp tục nhân nó với 10 cho đến khi nó trở nên lớn hơn với số của chúng tôi. Trong quá trình này, chúng tôi cũng sẽ sử dụng biến độ dài sẽ theo dõi độ dài của số:
int length = 0;Trong mã này, dòng temp * = 10 giống như viết temp = (temp << 3) + (temp << 1) . Vì phép nhân thường là hoạt động tốn kém hơn trên một số bộ xử lý khi so sánh với các toán tử thay đổi, nên sau này có thể hiệu quả hơn một chút.
long temp = 1;
while (temp <= number) {
length++;
temp *= 10;
}
return length;
2.4. Chia rẽ với sức mạnh của hai
Nếu chúng ta biết về phạm vi số của chúng ta, thì chúng ta có thể sử dụng một biến thể sẽ làm giảm hơn nữa sự so sánh của chúng ta. Phương pháp này chia số cho các lũy thừa của hai (ví dụ 1, 2, 4, 8, v.v.):
Phương pháp này chia số cho các lũy thừa của hai (ví dụ 1, 2, 4, 8, v.v.):
int length = 1;Nó lợi dụng thực tế là bất kỳ số nào cũng có thể được biểu diễn bằng việc thêm các lũy thừa của 2. Ví dụ, 15 có thể được biểu diễn dưới dạng 8 + 4 + 2 + 1, tất cả đều là lũy thừa của 2.
if (number >= 100000000) {
length += 8;
number /= 100000000;
}
if (number >= 10000) {
length += 4;
number /= 10000;
}
if (number >= 100) {
length += 2;
number /= 100;
}
if (number >= 10) {
length += 1;
}
return length;
Đối với một số gồm 15 chữ số, chúng tôi sẽ thực hiện 15 so sánh theo cách tiếp cận trước đây, chúng tôi đã giảm xuống chỉ còn 4 trong phương pháp này.
2.5. Phân chia và chinh phục
Đây có lẽ là cách tiếp cận mạnh mẽ nhất khi so sánh với tất cả các mô tả khác ở đây, nhưng không cần phải nói, đây là cách nhanh nhất vì chúng tôi không thực hiện bất kỳ loại chuyển đổi, nhân, thêm hoặc khởi tạo đối tượng nào.
Chúng tôi nhận được câu trả lời của chúng tôi chỉ trong vòng ba hoặc bốn đơn giản nếu báo cáo:
if (number < 100000) {Tương tự như cách tiếp cận trước đây, chúng ta chỉ có thể sử dụng phương pháp này nếu chúng ta biết về phạm vi số của chúng ta.
if (number < 100) {
if (number < 10) {
return 1;
} else {
return 2;
}
} else {
if (number < 1000) {
return 3;
} else {
if (number < 10000) {
return 4;
} else {
return 5;
}
}
}
} else {
if (number < 10000000) {
if (number < 1000000) {
return 6;
} else {
return 7;
}
} else {
if (number < 100000000) {
return 8;
} else {
if (number < 1000000000) {
return 9;
} else {
return 10;
}
}
}
}
3. Kết luận
Trong bài viết ngắn gọn này, chúng tôi đã phác thảo một số cách để tìm số chữ số trong một Số nguyên và chúng tôi đã so sánh hiệu quả của từng phương pháp.
No comments:
Post a Comment