Bài toán: Hãy liệt kê các giá trị trong mảng một chiều các số nguyên tố có chữ số lẻ đầu tiên.
- Input
3 12 13 15 17
- Output
13 17
Hướng dẫn cách liệt kê số nguyên tố có chữ số lẻ đầu tiên
Một số thỏa mãn yêu cầu bài toán thì số đó vừa là số nguyên tố vừa có chữ số lẻ đầu tiên. Nếu các bạn chưa biết cách kiểm tra số nguyên tố thì có thể xem lại tại đây.
Bây giờ chúng ta sẽ đi xây dựng một hàm kiểm xem số nguyên đó có chữ số lẻ đầu tiên hay không.
Xây dựng hàm kiểm tra chữ số lẻ đầu tiên
Ý tưởng của mình là sẽ lấy từng chữ số của số nguyên ra đến khi gặp chữ số đầu tiên. Sau khi có chữ số đầu tiên thì ta sẽ tiến hành kiểm tra xem số đó có phải là số lẻ hay không.
bool isCheck(int number) { int temp = 0; while (number > 0) { temp = number % 10; number /= 10; } if (temp % 2 == 1) return true; return false; }
Hàm isCheck
sẽ trả về giá trị true nếu số nguyên number có chữ số lẻ đầu tiên và ngược lại.
Ta sẽ tiến hành lấy từng chữ số của số nguyên number ra trong vòng lặp while
. Ta có thể chạy bằng tay như sau
TH1: number = 0; //Vòng lặp while không chạy temp = 0; return false; TH2: number =135; temp = 0; //Vòng lặp while chạy *number = 135; temp = 5; *number = 13; temp = 3; *number = 1; temp = 1; *number = 0; //Kết thúc vòng while return true;
Code tham khảo:
Code c++
#include<string> #include<math.h> #include <iostream> using namespace std; bool isnguyenTo(int number) { if (number < 2) return false; for (int i = 2; i <= sqrt(number); i++) if (number%i == 0) return false; return true; } bool isCheck(int number) { int temp = 0; while (number > 0) { temp = number % 10; number /= 10; } if (temp % 2 == 1) return true; return false; } void nhap(int a[], int n) { for (int i = 0; i < n; i++) { cout << "Nhap a[" << i << "]: "; cin >> a[i]; } cout << endl; } int main() { int a[100]; int n; cout << "Nhap n: "; cin >> n; nhap(a, n); for (int i = 0; i < n; i++) { if (isnguyenTo(a[i]) && isCheck(a[i])) cout << a[i] << " "; } }
Nhap n: 4 Nhap a[0]: 1 Nhap a[1]: 13 Nhap a[2]: 14 Nhap a[3]: 17 13 17
Trong đoạn code trên thay vì viết isCheck(number) == true && isNguyenTo(number) == true
thì để đơn giản mình lại viết như thế này cho ngắn gọn: isCheck(number) && isnguyenTo(number)
hai cách viết này là giống nhau.
Code c
#include<conio.h> #include<math.h> #include <stdio.h> bool isnguyenTo(int number) { if (number < 2) return false; for (int i = 2; i <= sqrt(number); i++) if (number%i == 0) return false; return true; } bool isCheck(int number) { int temp = 0; while (number > 0) { temp = number % 10; number /= 10; } if (temp % 2 == 1) return true; return false; } void nhap(int a[], int n) { for (int i = 0; i < n; i++) { printf("Nhap a[%d]: ", i); scanf("%d", &a[i]); } printf("n"); } int main() { int a[100]; int n; printf("Nhap n: "); scanf("%d", &n); nhap(a, n); for (int i = 0; i < n; i++) { if (isnguyenTo(a[i]) && isCheck(a[i])) printf("%d ", a[i]); } }
Nhap n: 4 Nhap a[0]: 1 Nhap a[1]: 13 Nhap a[2]: 14 Nhap a[3]: 18 13
Lưu ý: Nếu các bạn dùng Visual Studio để code thì phải dùng hàm scanf_s thay vì scanf.
Cải thiện chương trình
Cải thiện hàm isCheck
Thay vì phải lấy ra từng chữ số để xét thì chúng ta có thể dùng string để xử lý. Khi đó chúng ta chỉ cần xét kí tự đầu tiên của chuỗi mà thôi. Các bạn có thể tham khảo cách chuyển từ int sang string tại đây.
bool isCheck(int number) { string result; ostringstream convert; convert << number; result = convert.str(); int numberFirst = result[0] - '0'; if (numberFirst % 2 == 1) return true; return false; }
Lưu ý: Nhớ include thêm thư viện nhé!
Bài viết mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !
Để lại một bình luận