Viết chương trình đảo ngược một số nguyên dương có đúng 3 chữ số

Tìm số đảo ngược của một số là một bài tập lập trình cơ bản. Bài tập này giúp các bạn luyện tập tư duy lập trình cũng như khả năng giải quyết các bài toán. Bài tập này có khá nhiều cách tiếp cận khác nhau. Hãy cùng Lập trình không khó đi tìm gợi ý và lời giải cho bài tập này nhé.

Viết chương trình đảo ngược một số nguyên dương có đúng 3 chữ số
Viết chương trình đảo ngược một số nguyên dương có đúng 3 chữ số

NỘI DUNG BÀI VIẾT

Bài toán tìm số đảo ngược của một số

Trong ngôn ngữ lập trình C/C++. Nhập vào một số nguyên dương n từ bàn phím. In ra số đảo ngược của số n vừa nhập.

Ví dụ:

  1. Nhập n = 12345 -> Khi đó số đảo ngược của n = 54321.
  2. Nhập n == 12340 -> Khi đó số đảo ngược của n = 4321.
  3. Nhập n = 1000 -> Khi đó số đảo ngược của n = 1.

Nhận xét bài toán

  1. Nếu n là một số nguyên dương nhỏ, ta có thể tính toán trên kiểu int hoặc long long của C/C++
  2. Chú ý trường hợp có số 0 ở cuối(Tùy cách giải)
  3. Nếu n có nhiều chữ số(giả sử có thể lên tới vài nghìn chữ số). Khi đó chúng ta cần sử dụng mảng ký tự trong C hoặc kiểu string của C++ để xử lý.

Ý tưởng tìm số đảo ngược

Đối với số nhỏ, nằm trong phạm vi cho phép có kiểu dữ liệu số. Bạn có thể tìm số đảo ngược của một số sử dụng 1 trong 2 cách sau.

Cách 1:

Giả sử n = 12345. Khi đó ta có thể viết n = 1*105 + 2*104 + 3*103 + 4*102 + 5*101

Vậy số ngược lại của n = 54321 có thể viết thành 5*105 + 4*104 + 3*103 + 2*102 + 1*101

Nếu bạn để ý, chúng có sự trái ngược nhau. Bạn có thể lợi dụng tính chất này để tìm số đảo ngược.

Cách 2:

Lấy từng chữ số ở hàng đơn vị và in ra luôn. Ta có thể sử dụng 2 toán tử chia nguyên(/) và chia dư(%) của C/C++.

Chẳng hạn n = 12345.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

n = 12345

digit = n % 10 = 5

n = n / 10 = 1234

 

digit = n % 10 = 4

n = n / 10 = 123

 

digit = n % 10 = 3

n = n / 10 = 12

 

digit = n % 10 = 2

n = n / 10 = 1

 

digit = n % 10 = 1

n = n / 10 = 0

Nếu bạn sử dụng cách này. Bạn cần lưu ý trường hợp có số 0 ở cuối. Vì khi đảo ngược, không cho phép có số 0 ở đầu.

Trong trường hợp tổng quát, bạn có thể sử dụng cách 3 này. Cũng rất đơn giản nhé.

Cách 3:

Đối với số lớn, có hàng nghìn đến hàng triệu ký tự. Khi đó bạn cần dùng string để lưu số này. Tất nhiên bạn vẫn có thể sử dụng cách này với số nhỏ. Khi đó, bài toán khá đơn giản, chỉ cần for ngược từ cuối chuỗi về đầu là xong. Nhưng cần lưu ý số 0 ở cuối nhé!

Code bài tập tìm số đảo ngược của 1 số

Lưu ý: Các bạn hãy cố gắng tự mình giải quyết bài toán trước khi xem đáp án.

Viết chương trình đảo ngược một số nguyên dương có đúng 3 chữ số
Viết chương trình đảo ngược một số nguyên dương có đúng 3 chữ số

Code dưới đây được Nguyễn Văn Hiếu Blog trình bày bằng ngôn ngữ lập trình C++.

Cách 1:

Code C:

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <stdio.h>

int main(){

    int n, tmp;

    scanf("%d", &n);

    int res = 0;

    while(n > 0){

        tmp = n % 10;

        res = res * 10 + tmp;

        n = n / 10;

    }

    printf("%d", res);

}

Code C++:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#include &lt;iostream&gt;

using namespace std;

 

int main(){

    int n, tmp;

    cin &gt;&gt; n;

    int res = 0;

    while(n &gt; 0){

        tmp = n % 10;

        res = res * 10 + tmp;

        n = n / 10;

    }

    cout &lt;&lt; res;

}

Giải thích:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

Ví dụ với n = 123450

 

Check n = 123450 > 0 ? True

tmp = n % 10 = 123450 % 10 = 0

res = res * 10 + tmp = 0 * 10 + 0 = 0

n = n / 10 = 123450 / 10 = 12345

 

Check n = 12345 > 0 ? True

tmp = n % 10 = 12345 % 10 = 5

res = res * 10 + tmp = 0 * 10 + 5 = 5

n = n / 10 = 12345 / 10 = 1234

 

Check n = 1234 > 0 ? True

tmp = n % 10 = 1234 % 10 = 4

res = res * 10 + tmp = 5 * 10 + 4 = 54

n = n / 10 = 1234 / 10 = 123

 

Check n = 123 > 0 ? True

tmp = n % 10 = 123 % 10 = 3

res = res * 10 + tmp = 54 * 10 + 3 = 543

n = n / 10 = 123 / 10 = 12

 

Check n = 12 > 0 ? True

tmp = n % 10 = 12 % 10 = 2

res = res * 10 + tmp = 543 * 10 + 2 = 5432

n = n / 10 = 12 / 10 = 1

 

Check n = 1 > 0 ? True

tmp = n % 10 = 1 % 10 = 1

res = res * 10 + tmp = 5432 * 10 + 1 = 54321

n = n / 10 = 1 / 10 = 0

 

Check n = 1 > 0 ? False

Cách 2:

Code C:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <stdio.h>

int main(){

    int n, tmp;

    scanf("%d", &n);

    bool first = true;

    while(n > 0){

        tmp = n % 10;

        if(first == true){

            if(tmp != 0){

                printf("%d", tmp);

                first = false;

            }

        }else{

            printf("%d", tmp);

        }

        n = n / 10;

    }

}

Code C++:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include &lt;iostream&gt;

using namespace std;

 

int main(){

    int n, tmp;

    cin &gt;&gt; n;

    bool first = true;

    while(n &gt; 0){

        tmp = n % 10;

        if(first == true){

         if(tmp != 0){

         cout &lt;&lt; tmp;

         first = false;

            }

        }else{

            cout &lt;&lt; tmp;

        }

        n = n / 10;

    }

}

Giải thích:

Ở đây biến first có tác dụng đánh dấu có phải ta đang tìm số đầu tiên hay không. Nếu đang tìm số đầu tiên, ta chỉ in khi tmp khác giá trị 0. In được giá trị đầu tiên rồi thì gán first = false;. Trường hợp còn lại in ra bình thường.

Cách 3:

Code C++:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include &lt;iostream&gt;

#include &lt;string&gt;

using namespace std;

 

int main(){

    string s;

    cin &gt;&gt; s;

    int l = s.length();

    if(s[0] == '0'){

        cout &lt;&lt; "\nSo ban nhap khong hop le!";

        return 0;

    }

    for(int i = 0; i &lt; l; i++){

        if(s[i] &gt; '9' || s[i] &lt; '0'){

            cout &lt;&lt; "\nSo ban nhap khong hop le!";

            return 0;

        }

    }

    

    while(s[l-1] == '0') --l;

    

    for(int i = l-1; i &gt;= 0; --i){

        cout &lt;&lt; s[i];

    }

}

Giải thích:

Cách này thực hiện khá là đơn giản. Không cần tính toán phức tạp mà có thể chạy với số cực kỳ lớn. Có thể lên tới hàng triệu chữ số.

Lưu ý vì là string nên bạn cần kiểm tra kỹ càng số vừa nhập có hợp lệ không. Số hợp lệ là số không có số 0 ở đầu và chỉ gồm các ký tự số từ ‘0’ đến ‘9’.

Bạn có thể chạy thử với một số max lớn xem sao:

1

2

466423621641243213642046127603217462170621062074621762074271604

406172470267126470260126071264712306721640246312342146126324664

Kết luận

Như vậy, tôi đã kết thúc phần trình bày về bài toán tìm số đảo ngược của một số trên ngôn ngữ lập trình C++. Hi vọng bài viết mang lại cho bạn những kiến thức bổ ích và thú vị.

Chúc các bạn học tốt!

  • TAGS
  • bài tập c++

Facebook

Twitter

Pinterest

WhatsApp

Nguyễn Văn Hiếu

Sáng lập cộng đồng Lập Trình Không Khó với mong muốn giúp đỡ các bạn trẻ trên con đường trở thành những lập trình viên tương lai. Tất cả những gì tôi viết ra đây chỉ đơn giản là sở thích ghi lại các kiến thức mà tôi tích lũy được.