Kiểm tra số đối xứng trong C++ là một bài toán cơ bản nhằm giúp cho người học lập trình C++ có được các kiến thức về lập trình. Một số được gọi là số đối xứng nếu đọc từ trái qua phải(cách đọc thông thường) và đọc từ phải qua trái đều có giá trị như nhau.
Ví dụ số đối xứng: 1, 2, 3, 11, 121, 4994, …
Phân tích bài toán
Theo định nghĩa số đối xứng ở trên. Ta có một số nhận định sau:
- Số có 1 chữ số là số đối xứng
- Số có số lượng chữ số lẻ sẽ đối xứng qua số ở chính giữa. Như vậy, khi kiểm tra có thể bỏ qua số chính giữa
Có nhiều cách khác nhauđể kiểm tra số đối xứng.
Cách 1: Chứng minh sử dụng định nghĩa
Đảo ngược số ban đầu, kiểm tra số đảo ngược có bằng số ban đầu hay không.
Với cách này, bạn cần sử dụng toán tử chia nguyên /
và chia dư %
để thực hiện tính toán.
Đây cũng là cách mình sẽ cung cấp code ở phần tiếp theo.
Cách 2:
Coi số cần nhập là một chuỗi kiểu char[]
hoặc kiểu string
. Như vậy, ta cần kiểm tra từng ký tự ở nửa đầu có giống từng ký tự ở nửa cuối không?
Gọi n là chiều dài của chuỗi s.
Xét i < n/2
, kiểm tra nếu tồn tại s[i] != s[n-i-1]
thì đó không phải số đối xứng. Ngược lại, đó là số đối xứng.
Nhận xét:
- Cách thứ 2 sẽ khả thi ngay cả khi số bạn nhập vào có tới hàng triệu chữ số.
- Xét về tốc độ, cả 2 cách đều có cùng độ phức tạp tuyến tính.
Chủ đề được gợi ý: Cách tìm ước chung lớn nhất
Code kiểm tra số đối xứng C/C++
Code dưới đây được triển khai theo cách thứ nhất.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include<stdio.h> #include <iostream> using namespace std; int main(){ int num,r,sum=0,temp; cout << "Enter a number: "; cin >> num; for(temp=num;num!=0;num=num/10){ r=num%10; sum=sum*10+r; } if(temp==sum) cout << temp << " is a palindrome"; else cout << temp << " is not a palindrome"; return 0; } |
Ouput:
0 1 2 3 4 5 6 | Enter a number: 25 25 is not a palindrome Enter a number: 1991 1991 is a palindrome |
Chúc các bạn học tốt!
Với cách thứ 2(cá nhân mình đánh giá tốt hơn) bạn cần viết thêm hàm kiểm tra số người dùng nhập có đúng là số không, bao gồm:
- Chiều dài(số lượng ký tự) phải là số dương
- Số đầu tiên khác số 0
- Tất cả các ký tự phải là ký tự số
Lời giải tham khảo:
0 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 34 35 36 37 38 39 40 41 42 | #include <stdio.h> #include <string.h> // Ham kiem tra chuoi co phai day so khong bool IsNumber(char s[], int n){ if(n == 0) return false; if(s[0] == '0') return false; for(int i = 0; i < n;i++){ if(s[i] < '0' || s[i] > '9') return false; } return true; } int main(){ char s[100]; gets(s); int n = strlen(s); // Neu khong phai day so thi thoat chuong trinh if(IsNumber(s, n) == false){ printf("\nBan nhap sai dinh dang!"); return 0; } bool isPar = true; int i = 0, j = n - 1; while(i < j){ if(s[i] != s[j]){ isPar = false; break; }else{ ++i; // Tang dau --j; // Giam cuoi } } if(isPar == true){ printf("%s la so doi xung!", s); }else{ printf("%s khong la so doi xung!", s); } } |
mình có bài toán về xâu đối xứng nhưng chưa giải được nhờ bạn giúp mình được không?
Đề bài: Một xâu gọi là xâu đối xứng nếu đem đảo ngược xâu đó ta lại nhận được xâu ban đầu. Cho xâu S, hãy tìm số kí tự ít nhất cần thêm vào S để S trở thành xâu đối xứng.
Cảm ơn nhiều ạ
Bạn có thể thử làm theo hướng này: 0/ Check nếu đã đối xứng -> đáp án là 0. 1/ Chia đôi xâu ra, bỏ qua 1 ký tự ở giữa, nếu length chẵn thì xem xét nên bỏ giữa trái hay giữa phải. Vì số ký tự cần thêm là tối thiểu, nên tận dụng trường hợp length lẻ để bỏ qua ký tự giữa. 2/ Đếm xem có bao nhiêu ký tự ở nửa trái mà không có ở vị trí đối xứng bên nửa phải 3/ Đếm xem có bao nhiêu ký tự ở nửa phải mà… Read more »
a có thể làm về hàm đếm số nguyên tố đối xứng trong mảng 2 chiều với ạ
Em xem bài hướng dẫn (1) để làm bài đếm số nguyên tố có trong mảng nhé. Sau khi biết được nó là số nguyên tố rồi thì em có thể sử dụng kiến thức của bài số (2) để xem số nguyên tố đó có phải số đối xứng không.
1. https://nguyenvanhieu.vn/dem-so-luong-so-nguyen-to-co-trong-mang/
2. https://nguyenvanhieu.vn/kiem-tra-so-doi-xung-trong-c-c/
Em dùng số (2) vào hàm DemSNT là được. Chúc em học tốt!
Anh ơi cho em hỏi sao mình cần phải so sánh với temp trong khi lấy sum so với n luôn lại không được ạ
Tại vì
num
nó bị thay đổi, ko còn giá trị ban đầu nữa em ạ, donum=num/10
anh chỉ em từng bước chạy chổ sum với chỗ r được không ạ!!
em cũng có cách khác nhung em thử cách của thầy vs cach của em đều có 1 điểm chung nó chỉ đúng với 9 chữ số trên 9 số sẽ không đúng
Nếu số lớn em cần dùng cách 2