Làm cách nào để kiểm tra xem một số có phải là số có 4 chữ số C++ không?

Trong hướng dẫn nhanh này, chúng ta sẽ khám phá các cách khác nhau để lấy số chữ số trong một Số nguyên trong Java

Chúng tôi cũng sẽ phân tích các phương pháp khác nhau để tìm ra thuật toán nào phù hợp nhất với từng tình huống

đọc thêm

Cách làm tròn một số thành N chữ số thập phân trong Java

Tổng quan về một số cách xử lý vấn đề chung về làm tròn số thập phân trong Java

Đọc thêm →

Kiểm tra xem một chuỗi có phải là số trong Java không

Khám phá các cách khác nhau để xác định xem một Chuỗi có phải là số hay không

Đọc thêm →

Hướng dẫn thực hành về DecimalFormat

Khám phá lớp DecimalFormat của Java cùng với các ứng dụng thực tế của nó

Đọc thêm →

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 pháp 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 để lấy số chữ số trong một 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();

Tuy nhiên, đây có thể là một cách tiếp cận không tối ưu, vì câu lệnh này liên quan đến việc cấp phát bộ nhớ cho một Chuỗi cho mỗi lần đánh giá. JVM phải phân tích cú pháp số của chúng ta và sao chép các chữ số của nó thành một Chuỗi riêng biệt, cũng như thực hiện một số thao tác khác (như giữ các bản sao tạm thời, xử lý các chuyển đổi Unicode, v.v.)

Nếu chúng tôi chỉ có một vài con số để đánh giá, thì chúng tôi có thể sử dụng giải pháp này vì sự khác biệt giữa cách tiếp cận này và bất kỳ cách tiếp cận nào khác sẽ không đáng kể, ngay cả đối với số lượng lớn

2. 2. Phương pháp logarit

Đối với các số biểu diễn ở dạng thập phân, nếu lấy nhật ký của chúng ở cơ số 10 rồi làm tròn lên, ta sẽ được số chữ số của số đó

int length = (int) (Math.log10(number) + 1);

Lưu ý rằng log100 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 số đó

Phương pháp logarit nhanh hơn đáng kể so với phương pháp dựa trên Chuỗi, vì nó không phải trải qua bất kỳ quá trình chuyển đổi dữ liệu nào. Nó chỉ liên quan đến một phép tính đơn giản, dễ hiểu mà không có bất kỳ vòng lặp hoặc khởi tạo đối tượng bổ sung nào

2. 3. phép nhân lặp đi 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à liên tục nhân nó với 10 cho đến khi nó lớn hơn 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, biến này sẽ theo dõi độ dài của số

int length = 0;
long temp = 1;
while (temp <= number) {
    length++;
    temp *= 10;
}
return length;

Trong mã này, temp *= 10 giống như viết temp = (temp << 3) + (temp << 1). Vì phép nhân thường là một thao tác tốn kém hơn trên một số bộ xử lý so với toán tử ca, nên thao tác sau có thể hiệu quả hơn một chút

2. 4. Chia Với Quyền Hạn của Hai

Nếu chúng tôi biết phạm vi số của mình, thì chúng tôi có thể sử dụng một biến thể sẽ làm giảm thêm các phép so sánh của chúng tôi. Phương pháp này chia số cho lũy thừa của hai (e. g. 1, 2, 4, 8, v.v. )

int length = 1;
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;

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 phép cộng 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

Đối với số có 15 chữ số, chúng tôi sẽ thực hiện 15 phép so sánh trong phương pháp trước đây, so với chỉ 4 phép so sánh 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 cồng kềnh nhất khi so sánh với tất cả những cách khác được mô tả ở đây;

Chúng ta có thể nhận được câu trả lời chỉ trong ba hoặc bốn câu lệnh if đơn giản

if (number < 100000) {
    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;
            }
        }
    }
}

Tương tự như cách tiếp cận trước, chúng tôi chỉ có thể sử dụng phương pháp này nếu chúng tôi biết phạm vi số của chúng tôi

3. điểm chuẩn

Bây giờ chúng ta đã hiểu rõ về các giải pháp tiềm năng, hãy thực hiện một số phép đo điểm chuẩn đơn giản cho các phương pháp của chúng ta bằng Java Microbenchmark Harness (JMH)

Bảng sau đây cho biết thời gian xử lý trung bình của mỗi thao tác (tính bằng nano giây)

Benchmark                            Mode  Cnt   Score   Error  Units
Benchmarking.stringBasedSolution     avgt  200  32.736 ± 0.589  ns/op
Benchmarking.logarithmicApproach     avgt  200  26.123 ± 0.064  ns/op
Benchmarking.repeatedMultiplication  avgt  200   7.494 ± 0.207  ns/op
Benchmarking.dividingWithPowersOf2   avgt  200   1.264 ± 0.030  ns/op
Benchmarking.divideAndConquer        avgt  200   0.956 ± 0.011  ns/op

Giải pháp dựa trên Chuỗi, đơn giản nhất, cũng là hoạt động tốn kém nhất, vì đây là giải pháp duy nhất yêu cầu chuyển đổi dữ liệu và khởi tạo các đối tượng mới

Phương pháp logarit hiệu quả hơn đáng kể so với giải pháp trước đó vì nó không liên quan đến bất kỳ chuyển đổi dữ liệu nào. Ngoài ra, là một giải pháp dòng đơn, nó có thể là một giải pháp thay thế tốt cho phương pháp dựa trên Chuỗi

Phép nhân lặp liên quan đến phép nhân đơn giản theo tỷ lệ với độ dài số;

Tuy nhiên, phương pháp tiếp theo tận dụng lợi thế của thực tế là mọi số có thể được biểu diễn bằng lũy ​​thừa của hai (cách tiếp cận tương tự như BCD). Nó giảm cùng một phương trình thành bốn phép chia, do đó, nó thậm chí còn hiệu quả hơn so với trước đây

Cuối cùng, như chúng ta có thể suy luận, thuật toán hiệu quả nhất là triển khai Chia để trị dài dòng, đưa ra câu trả lời chỉ trong ba hoặc bốn câu lệnh if đơn giản. Chúng ta có thể sử dụng nó nếu chúng ta có một tập dữ liệu lớn gồm các số cần phân tích

4. Phần kết luận

Trong bài viết ngắ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à so sánh hiệu quả của từng cách

Làm cách nào để kiểm tra xem thứ gì đó có phải là chữ số trong C không?

The isdigit(c) là một hàm trong C có thể được sử dụng để kiểm tra xem ký tự được truyền có phải là một chữ số hay không. Nó trả về một giá trị khác 0 nếu đó là một chữ số khác, nó trả về 0. Ví dụ: nó trả về giá trị khác 0 cho '0' đến '9' và 0 cho các giá trị khác. isdigit() được khai báo bên trong ctype.

Làm cách nào để kiểm tra xem một số có 2 chữ số trong C hay không?

Chương trình C tìm số có 2 chữ số .
Biên tập / Câu trả lời hay nhất
trả lời bởi. Piyush Dixit. Thành viên từ tháng 9-2009. Đã trả lời Bật. Ngày 18 tháng 9 năm 2009. main() { int num,sum,i;

Làm thế nào để đảo ngược một số có bốn chữ số trong C?

Đảo ngược một số trong C . Bước 1. Nhân rev_num với 10 và thêm chữ số mà chúng tôi đã trích xuất từ ​​đầu vào . Bước 2. Cân bằng rev_num với kết quả thu được. Sau 4 lần lặp, rev_num chứa 5432, đây là kết quả bắt buộc của chúng tôi.

Làm cách nào để kiểm tra xem chuỗi có phải là số trong C không?

Sử dụng phương thức tích hợp isdigit() , mỗi ký tự của chuỗi được kiểm tra. Nếu ký tự chuỗi là một số, nó sẽ in chuỗi đó chứa int. Nếu chuỗi chứa ký tự hoặc bảng chữ cái, nó sẽ in ra chuỗi không chứa int.