Vì sao có sự khác nhau khi thay đổi lệnh

bool isPrime(int n){
	if (n<2){
        return false;
    }else{
        for(int i = 2;i<=sqrt(n);i++){
            if(n%i == 0){
                return false;
            }
        }
        return true;
    }
}
int main(){
    queue<int> q;
    int n; 
    cin >> n;
    for (int i = 2; i <= n, i < 10; i++){
        if (isPrime(i)){
            q.push(i);
        }
    }
    while (!q.empty()){
        for (int i = 1; i <= 9; i++){
            int k = q.front()*10 + i;
            if ( k <= n && isPrime(k)){
                q.push(q.front()*10 + i);
            }
        }
        cout << q.front() << " ";
        q.pop();
    }

    return 0;
}

Tại sao khi mình thay đổi (i<10 và i<=n) lên trước và sau thì có sự thay đổi ở dùng for đầu tiên hàm main

  • (i<=n,i<10) thì code sẽ sai với trường hợp n=4,6
  • (i<10,i<=n) thì code sẽ đúng với mọi trường hợp
    Dưới đây là code có thể ngắn hơn tại sao lại ko được sử dụng
bool tim_so_nguyen_to(int n){
    if (n<2){
        return false;
    }else{
        for(int i = 2;i<=sqrt(n);i++){
            if(n%i == 0){
                return false;
            }
        }
        return true;
    }
}
int main(){
    int n;
    cin >> n;
    queue<int> q;
    for( int i = 2;i<n;i++){
        if(tim_so_nguyen_to(i)){
            q.push(i);
        }
    }
    while(!q.empty()){
        cout << q.front()<< " ";
        q.pop();
    }
    return 0;
}

P/s : cảm ơn các bạn giúp đỡ nhé !!!

Không chỉ với 4 và 6 mà tất cả các n nhỏ hơn 10 đều cho ra 2 3 5 7 vì toán tử , sẽ trả về giá trị bên phải dấu ,. Điều này tương đương với điều kiện i <= n sẽ bị bỏ qua mà chỉ trả về kết quả true or false của điều kiện i < 10.
Nói chung là để dấu phẩy ở đó trong trường hợp này thì thằng bên trái dấu , là thừa thãi.

2 Likes

oke bạn , mình đã hiểu và bạn cho mình hỏi đoạn code của mình ở dưới có thể giải đươc bài này , sao họ lại làm phức tạp hơn là cần tìm các số nguyên tố nhỏ hơn 10 rồi mới tìm các số lớn hơn vậy
Thanks :))

Do đây là tìm số siêu nguyên tố chứ không phải số nguyên tố. Đoạn code bên dưới hình như chỉ là tìm số nguyên tố thôi.
Về lí do tại sao phải tìm số nguyên tố nhỏ hơn 10 rồi mới tìm đến các số khác vì theo định nghĩa số siêu nguyên tố mà anh/chị giải thích ở topic nào đó thì số siêu nguyên tố là số bớt đi 1 số bất kì đều ra được số nguyên tố.

oke bạn, mình nhầm mất :)))

1 Like

Xét đúng bài toán thì cái này phải là TH1 đúng hết còn TH2 sai hết chứ nhỉ

Ủa, có sẵn cái topic khác rồi mà, làm cái khác làm gì vậy? Muốn làm lại một topic khác với chủ đề tương tự thì phải xoá cái topic trước.

Ngoài ra, trong lập trình, để liên kết hai vế so sánh lại với nhau thì dùng hai toán tử logic là OR (||) và AND (&&)

3 Likes

mình ghi nhầm đó bạn, quên ko soát lại :))))

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