[C++] Tính tổng các số nguyên tố nhỏ hơn n và sắp xếp

Trong lập trình C/C++, việc xử lý số nguyên tố là một bài toán phổ biến, giúp rèn luyện tư duy thuật toán và kỹ năng lập trình. Bài viết này sẽ hướng dẫn bạn:

  1. Cách tính tổng các số nguyên tố nhỏ hơn n
  2. Sắp xếp các số nguyên tố về đầu dãy, các số còn lại về cuối.

Chúng ta sẽ xây dựng chương trình hoàn chỉnh, bao gồm các hàm kiểm tra số nguyên tố, tính toán, và thao tác với mảng số nguyên.

Xem thêm:

Bài 29: số nguyên tố cùng nhau

kiểm tra số chính phương c++

thuật toán kruskal c++

1. Tính tổng các số nguyên tố nhỏ hơn n

Bài 30 (TH-CSLT-02): Viết hàm kiểm tra một số nguyên có phải là số nguyên tố hay không? Áp dụng tính tổng các số nguyên tố nhỏ hơn số n với n được nhập vào từ bàn phím.

1.1.Ý tưởng thuật toán

Để giải quyết bài toán này, chúng ta có thể viết hai hàm:

  • Hàm kiểm tra số nguyên tố isPrime().
  • Hàm tính tổng các số nguyên tố: Duyệt qua các số từ 2 đến nhỏ hơn n để tính tổng.

1.2. Hàm kiểm tra số nguyên tố

Hàm isPrime() được dùng để kiểm tra xem một số nguyên a có phải là số nguyên tố hay không. Cách thức hoạt động của hàm như sau:

  • Trường hợp a nhỏ hơn 2: nếu a là 0 hoặc 1 thì không phải là số nguyên tố, vì vậy hàm sẽ trả về giá trị false.
  • Nếu a lớn hơn hoặc bằng 2, hàm sẽ duyệt từ 2 đến căn bậc hai của a, kiểm tra xem a có chia hết cho các số từ 2 đến căn bậc hai không. Nếu có, hàm sẽ trả về giá trị false, vì khi đó a không phải là số nguyên tố.
  • Chúng ta chỉ kiểm tra đến căn bậc 2 của a vì nếu a có ước số nào lớn hơn căn bậc hai của a, thì ước số đó sẽ phải nhỏ hơn căn bậc hai của a.Ví dụ, để kiểm tra xem số nguyên dương a=37 có phải là số nguyên tố hay không, ta chỉ cần kiểm tra các ước số từ 2 đến căn bậc hai của 37, tức là từ 2 đến 6. Nếu không tìm thấy bất kỳ ước số nào của a trong khoảng này, ta có thể kết luận rằng 37 là số nguyên tố.
  • Nếu hàm không trả về false trong vòng lặp, nghĩa là a không chia hết cho bất kỳ số nguyên nào từ 2 đến căn bậc hai của a, và do đó a là số nguyên tố. Hàm sẽ trả về giá trị true.
bool isPrime(int a) {
  if (a < 2) {
    return false;
  }
  for (int i = 2; i <= sqrt(a); i++) {
    if (a % i == 0) {
      return false;
    }
  }
  return true;
}

1.3. Hàm tính tổng các số nguyên tố nhỏ hơn n

Hàm sumPrime() là hàm tính tổng các số nguyên tố nhỏ hơn một số nguyên n được nhập từ bàn phím. Cách thức hoạt động của hàm như sau:

  • Duyệt qua các số nguyên từ 2 đến i<n bằng vòng lặp while.
  • Kiểm tra nếu số nguyên i là số nguyên tố bằng cách gọi hàm isPrime(i) thì tăng giá trị sum lên i.
  • Nếu số nguyên n cũng là số nguyên tố, thì thêm giá trị n vào tổng sum.
  • Tăng giá trị i lên 1 và tiếp tục duyệt đến khi i bằng n.
  • Trả về giá trị tổng sum.
int sumPrime(int n) {
  int sum = 0, i = 2;
  while (i < n) {
    if (isPrime(i)) {
      sum += i;
    }
    if (isPrime(n)) {
      sum += n;
    }
    i++;
  }
  return sum;
}

Liên quan:

tính tổng các phần tử trong mảng c++

tính tổng các phần tử trong mảng 2 chiều c++

1.4. Cài đặt chương trình

#include<iostream>
#include<math.h>
using namespace std;

//kiem tra so nguyen to
bool isPrime(int a){
    if(a<2){
        return false;
    }

    for(int i=2;i<=sqrt(a);i++){
        if(a%i==0){
            return false;
        }
    }

    return true;
}

//Tinh tong cac so nguyen to nho hon n

int sumPrime(int n){
    int sum=0,i=2;
    while(i<n){
        if(isPrime(i)){
            sum+=i;
        }
        if(isPrime(n)){
            sum+=n;
        }
        i++;
    }
    return sum;
}

int main(){
    int n;
    cout<<"Nhap so nguyen n:"; cin>>n;
    cout<<"Tong cac so nguyen to nho hon n= "<<sumPrime(n);
}

1.5. Kết quả chạy chương trình

Bộ test kiểm tra bài toán:

  1. Input: n = 10 Output: 17 Giải thích: Các số nguyên tố nhỏ hơn 10 là 2, 3, 5, 7. Tổng của chúng là 2 + 3 + 5 + 7 = 17.
  2. Input: n = 20 Output: 77 Giải thích: Các số nguyên tố nhỏ hơn 20 là 2, 3, 5, 7, 11, 13, 17, 19. Tổng của chúng là 2 + 3 + 5 + 7 + 11 + 13 + 17 + 19 = 77.
  3. Input: n = 1 Output: 0 Giải thích: Không có số nguyên tố nhỏ hơn 1.
  4. Input: n = 2 Output: 0 Giải thích: Không có số nguyên tố nhỏ hơn 2.
  5. Input: n = 100 Output: 1060 Giải thích: Các số nguyên tố nhỏ hơn 100 là 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97. Tổng của chúng là 1060.

Tính tổng các số nguyên tố nhỏ hơn N

 

 

 

 

 

 

2. Sắp xếp các số nguyên tố về đầu dãy

Bài 18: Nhập vào từ bàn phím dãy số gồm n số nguyên (n>0) và thực hiện các yêu cầu sau đây:

  1. Hiển thị dãy số ra màn hình.
  2. Nhập vào từ bàn phím số nguyên x. Hãy cho biết x xuất hiện trong dãy số bao nhiêu lần và các vị trí xuất hiện của x.
  3. Xoá các số có giá trị bằng 0 có trong dãy.
  4. Sắp xếp các số nguyên tố về đầu dãy, các số không phải là số nguyên tố về cuối dãy.
  5. Tính trung bình cộng các số chia hết cho 3 có trong dãy.

2.1. Ý tưởng thuật toán

– Có nhiều phương pháp để đưa các số nguyên tố về đầu dãy, dưới đây mình sẽ gợi ý cách tách thành 2 mảng theo các bước sau:

  • Xây dựng hàm kiểm tra số nguyên tố
  • Duyệt mảng, nếu là số nguyên tố thì gán vào mảng b ngược lại gán vào mảng c
  • Gộp mảng c vào mảng b và xuất mảng màn hình

Liên quan: tách mảng c++

Ví dụ mã nguồn:

void sapxepsonguyento(int n, int a[]){

    int b[255], c[255],m=0,k=0;
    //tachmang
    for(int i=0;i<n;i++){
        if(isPrime(a[i])){
            m++;
            b[m]=a[i];
        }else{
            k++;
            c[k]=a[i];
        }
    }
    //Gop mang
    for(int i=m+1;i<=n;i++){
        b[i]=c[i-m];
    }

    for(int i=1;i<=n;i++){
        cout<<setw(5)<<b[i];
    }
}

2.2. Cài đặt chương trình

Mã nguồn hoàn chỉnh:

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

//kiem tra so nguyen to
bool isPrime(int p){

        if(p<=1) return false;
        for(int i=2;i<=sqrt(p); i++){
            if(p%i==0){
                return false;
            }
        }
        return true;
    }

//nhap mang
void nhapmang(int n,int a[]){

    for(int i=0;i<n;i++){
        cout<<"a["<<i<<"]= ";
        cin>>a[i];
    }
}

//xuat mang
void xuatmang(int n, int a[]){
    for(int i=0;i<n;i++){
        cout<<setw(5)<<a[i];
    }
}


//Nhập vào từ bàn phím số nguyên x. Hãy cho biết x xuất hiện trong dãy số bao nhiêu lần và các vị trí xuất hiện của x
void timx(int n, int a[]){

    int x,dem;
    cout<<"Nhap so nguyen x: "; cin>>x;
    for(int i=0;i<n;i++){
        if(a[i]==x){
            dem++;
            cout<<" Phan tu "<<x<<" xuat hien vi tri "<<i+1<<endl;
        }
    }

    if(dem!=0){
        cout<<"Phan tu "<<x<<" xuat hien "<<dem<<" lan";
    }else{
        cout<<"Khong co phan tu nao bang x";
    }
}


void Xoacacsocogiatribang0(int n, int a[]){
    int j=0;
    for(int i=0;i<n;i++){
        if(a[i]!=0){
            a[j]=a[i];
            j++;
        }
    }

    for(int i=0;i<j;i++){
        cout<<setw(5)<<a[i];
    }
}

//Sắp xếp các số nguyên tố về đầu dãy, các số không phải là số nguyên tố về cuối dãy
void sapxepsonguyento(int n, int a[]){

    int b[255], c[255],m=0,k=0;

    for(int i=0;i<n;i++){
        if(isPrime(a[i])){
            m++;
            b[m]=a[i];
        }else{
            k++;
            c[k]=a[i];
        }
    }

    for(int i=m+1;i<=n;i++){
        b[i]=c[i-m];
    }

    for(int i=1;i<=n;i++){
        cout<<setw(5)<<b[i];
    }
}

//Tính trung bình cộng các số chia hết cho 3 có trong dãy
void trungbinhcong(int n, int a[]){

    int sum=0,d=0;
    for(int i=0;i<n;i++){
        if(a[i]%3==0){
            sum+=a[i];
            d++;
        }
    }

    if(sum==0){
        cout<<"khong co so nao chia het cho 3"<<endl;
    }else{
        cout<<"Trung binh cac so chia het cho 3 = "<<sum/d;
    }
}
int main(){

    int i, n, chon, x, a[255];

    do{
        cout<<"1. Nhap mang"<<endl;
        cout<<"2. Xuat mang"<<endl;
        cout<<"3. Cho biet x xuat hien bao nhieu lan"<<endl;
        cout<<"4. Sap xep so nguyen to ve dau day"<<endl;
        cout<<"5. Tinh trung binh cong cac so chia het cho 3"<<endl;
        cout<<"6. Xoa cac so co gia tri bang 0 trong day"<<endl;
        cout<<"Lua chon: "; cin>>chon;

        switch(chon){
            case 1:{
                cout<<"Nhap so phan tu: "; cin>>n;
                nhapmang(n,a);
                cout<<endl;
                break;
            }
            case 2:{
                xuatmang(n,a);
                 cout<<endl;
                break;
            }
            case 3:{
                timx(n,a);
                cout<<endl;
                break;
            }
            case 4:{
                sapxepsonguyento(n,a);
                cout<<endl;
                break;
            }
            case 5:{
                trungbinhcong(n,a);
                cout<<endl;
                break;
            }
            case 6:{
                Xoacacsocogiatribang0(n,a);
                cout<<endl;
                break;
            }

            default: exit(0);
        }
    }while(chon!=0);

}

2.3 Kết quả chạy chương trình

Bài thực hành 18 lập trình c++

Bài thực hành 18 lập trình c++

Trên đây là đoạn mã đơn giản và thuật toán tính tổng các số nguyên tố nhỏ hơn n và sắp xếp . Cảm ơn các bạn đã theo dõi trên ttnguyen.net

Tải full bài tập thực hành C/C++ có lời giải:

Bài viết cùng chủ đề:

thuật toán prim

file nhị phân c++

xoá phần tử trong mảng c++

viết chương trình nhập vào tọa độ 2 điểm

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em