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é.
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ụ:
- Nhập n = 12345 -> Khi đó số đảo ngược của n = 54321.
- Nhập n == 12340 -> Khi đó số đảo ngược của n = 4321.
- Nhập n = 1000 -> Khi đó số đảo ngược của n = 1.
Nhận xét bài toán
- 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++
- Chú ý trường hợp có số 0 ở cuối(Tùy cách giải)
- 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.
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.
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:
#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++:
#include <iostream> using namespace std; int main(){ int n, tmp; cin >> n; int res = 0; while(n > 0){ tmp = n % 10; res = res * 10 + tmp; n = n / 10; } cout << res; }
Giải thích:
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:
#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++:
#include <iostream> using namespace std; int main(){ int n, tmp; cin >> n; bool first = true; while(n > 0){ tmp = n % 10; if(first == true){ if(tmp != 0){ cout << tmp; first = false; } }else{ cout << 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++:
#include <iostream> #include <string> using namespace std; int main(){ string s; cin >> s; int l = s.length(); if(s[0] == '0'){ cout << "nSo ban nhap khong hop le!"; return 0; } for(int i = 0; i < l; i++){ if(s[i] > '9' || s[i] < '0'){ cout << "nSo ban nhap khong hop le!"; return 0; } } while(s[l-1] == '0') --l; for(int i = l-1; i >= 0; --i){ cout << 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:
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!
Để lại một bình luận