Tại sao khi chạy chương trình thi phần xuatsoNT lại không hoạt động?

Mn giúp em tại sao khi chạy chương trình thi phần xuatsoNT lại không hoạt động ạ

#include <iostream>

using namespace std;
void nhapMang(int a[],int n)
{
    for (int i=0;i<n;i++)
    {

        cout<<"\nGia Tri cua A["<<i<<"]=";
        cin >>a[i];
    }
}
void xuatMang(int b[],int n)
{
    for (int i=0;i<n;i++)
    {
        cout <<b[i]<<"\t";
    }
}
int kiemtraNT(int x)
{
    int dem=0;
    for(int i=1;i<=x;i++)
    {
        if (i%x==0)
        {
            dem++;
        }
        if (dem==2)
        {
            return 1;
        }
        return 0;
    }
}
void xuatsoNT(int a[],int n)
{
    cout <<"\nSo nguyen to trong mang la :\n";
    for (int i=0;i<n;i++)
    {
    if (kiemtraNT(a[i])==1)
    {
        cout <<a[i]<<"\t";
    }

    }
}
int main()
{
    int a[100];
    int n=0;
   cout <<"Nhap so luon phan tu n :"<<endl;
   cin >>n;
   cout <<"\nNhap Mang\n";
   nhapMang(a,n);
   cout <<"\nXuat mang\n";
   xuatMang(a,n);
   xuatsoNT(a,n);
    return 0;
}

Tại dòng này nè. :slight_smile:

i phải chạy từ 2 chứ, và cũng không thể chạy đến x được. :slight_smile:

Sửa lại như này được rồi.

int kiemtraNT(int x) {
    if (x < 2) return 0;
    if (x == 2) return 1;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return 0;
    }
    return 1;
}
2 Likes

xl, theo tôi bạn nên hỏi là tại sao phần xuatsoNT chạy sai thì đúng hơn là tại sao không chạy?
Tôi k biết về c++ nhưng theo tôi code chỗ này không hợp lý.

Là tôi, tôi sẽ chỉ truyền mảng a[], còn n thì tự tính trong hàm, vì đôi lúc bạn sẽ k kiểm soát được giá trị truyền vào của người dùng. lỡ họ truyền n > a.length thì chương trình của bạn sẽ có lỗi.
Mn cùng thảo luận thêm.
thân,

1 Like

Không biết bạn tính n trong hàm kiểu gì nhỉ. :slight_smile:

n = sizeof(a) / sizeof(a[0]);

có vẻ ổn.

Khi truyền vào hàm mảng suy biến thành con trỏ thường :smiley: nên ko áp dụng được.

3 Likes

Truyền vô hàm như này:

void sher(int *a);

Thì hông được nè anh.

Còn nếu truyền như này:

void sher(int a[]);

Nó lại tùy compiler, em test trên các IDE online thì sizeof(a) / sizeof(a[0]) nó chỉ có bằng một nửa bên ngoài. :slight_smile:

Cũng code đó nhưng dùng g++ thì out là 1. :slight_smile:

2 Likes

tôi thấy trong java có hàm tính độ dài mảng mà.
Trong trường hợp của bạn nhập n từ màn hình nên chắc cách của bạn k vấn đề gì (tôi đọc thấy ở các bạn khác code c++ cũng đều truyền cả n vào, có lẽ hàm của bạn không sao đâu)

Như nhau thôi bạn :slight_smile: con trỏ 8 byte mà int thì 4 byte thì 8 / 4 ra 2.

3 Likes

Đây là C/C++ nha. Tag cũng là C++ kìa. :confused:

Như trong Java thì mảng của nó là đối tượng nên có thể lấy được size của mảng. :slight_smile:

Thực ra trong C++ cũng làm được vậy nếu dùng std::array hoặc std::vector, nhưng bài của thớt là mảng đơn thuần. :slight_smile:


Ra là vậy, cảm ơn anh. :kissing_smiling_eyes:

1 Like

Nếu truyền theo kiểu vậy sẽ bị một vấn đề gọi là Array decay.

Trong hàm kiemtraNT có đoạn return 0 vẫn nằm trong vòng for
với i = 1 -> return 0;
i = 2 --> dem ++ --> return 0 ?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?