Uhm.
a = new int(n); // nếu n = 5, kết quả a = 5
a = new int[n]; // cái này mới là tạo mảng. Cậu viết sai ngoặc rồi.
Uhm.
a = new int(n); // nếu n = 5, kết quả a = 5
a = new int[n]; // cái này mới là tạo mảng. Cậu viết sai ngoặc rồi.
nếu chỉ viết code kiểm tra số nguyên tố thì mình viết được như dưới đây:
bool laSNT = true;
for (int i = 2; i <= x - 1; i++){
if (x % i == 0){
laSNT = false;
break;
}
}
if (laSNT == true){
cout << x << " ";
còn gắn thêm đoạn code để chuyển index từ a[0] sang a[1], v.v thì đang bị vướng lại
Ok, vậy dòng if j có bao giờ được kiểm tra không?
oops, đa tạ, mình viết nhầm ngoặc @@ lỗi newbie thường gặp
theo mình thấy từ bảng kết quả thì hình như tới chỗ break nó dừng mất tiêu nên đáp án lúc nào cũng ra 0 hết @@, nhưng nếu k để break thì nó cứ chạy mãi tới khi j = a[i] mới thôi @@ hoang mang ghê
Bạn có lẽ không nắm chắc kiến thức chứ không phải nhầm đâu.
Bạn viết được đoạn code kiểm tra số nguyên tố của 1 số được, áp dụng vòng for chỉ số mảng bên ngoài là được thôi. Bạn hiểu được flow của code của bạn không?
ý tưởng của mình là cho nó kiểm tra điều kiện, chỉ cần nó đúng điều kiện thì dừng việc tăng j mà chuyển sang phần tử kế của mảng bằng cách tăng i, còn nếu a[i] k chia hết cho j thì cho nó chạy mãi tới khi j == a[i] thì tăng biến đếm.
giờ mình cũng chẳng biết mình lủng kiến thức chỗ nào nữa @@, cảm giác giống đang học C++ như mỳ ăn liền, 1 khóa C++ của mình có 10 buổi thôi, những phần còn lại của C thầy mình bảo sẽ xuất hiện ở những ngôn ngữ cao hơn nên k dạy
Bạn đọc dòng này chưa? Nếu đọc rồi thì thử áp dụng xem. Qua bao nhiêu post mà bạn không phản ứng gì, mình buồn đó
Cậu có vấn đề hơi nghiêm trọng đấy
Cốt lõi trong lập trình là “chia để trị”. Code để kiểm tra số nguyên tố của cậu thực ra không thể gắn thêm được đâu.
bool laSNT = true;
for (int i = 2; i <= x - 1; i++){
if (x % i == 0){
laSNT = false;
break;
}
}
if (laSNT == true){
cout << x << " ";
Giờ, nếu cậu chia bài toán của cậu, thành:
Bài toán đầu tiên như thế này:
int isPrime(int n) {
int i;
for (i = 2; i <= sqrt(n); i++) {
if(n % i == 0) {
return 0;
}
}
return 1;
}
thì bài toán thứ 2, duyệt từ đầu tới cuối mảng, kết hợp với bài toán đầu, sẽ ra:
int main() {
int i, size;
// ...
for(i = 0; i < size; i++) {
if(isPrime(arr[i])) {
// in ra màn hình
}
}
}
Rồi, giờ nếu cậu inline toàn bộ hàm isPrime
, cậu sẽ có code mà cậu cần.
Trông đơn giản không? Chỉ cần “chia để trị” thôi
Dĩ nhiên, để inline cậu cần sửa lại 1 chút. Cậu cần 1 biến trung gian, cần đổi lại biến i
do cậu đã có biến i rồi, cơ mà đa phần công việc sẽ là copy paste và sửa chút thôi.
Code cuối sau khi inline của cậu có thể sẽ giống thế này:
int main() {
int i, size;
// ...
for(i = 0; i < size; i++) {
int j;
int isPrime = 1;
for (j = 2; j <= sqrt(n); j++) {
if(n % j == 0) {
isPrime = 0;
break;
}
}
if(isPrime) {
// in ra màn hình
}
}
}
nói thiệt thì vô cùng cảm ơn bạn đã chỉ ra vô cùng chi tiết, nhưng chắc do mình lủng kiến thức hay sao mà mình thấy đoạn này của bạn
nó giống với đoạn code này của mình
int dem = 0;
for (int i = 0; i < n; i++){
bool prime = true;
if (a[i] < 2){
prime = false;
}
for (int j = 2; j <= a[i]/2; j++){
if (a[i] % j == 0){
prime = false;
break;
}
}
if (prime == true){
dem++;
cout << a[i] << " ";
}
}
cout << "So nguyen to xuat hien: " << dem;
mình cũng cố viết lại code nhưng k hỉu sao nó lại không liên kết giữa việc xét số nguyên tố và thay đổi phần tử trong mảng ấy chứ @@ @noname00 giống mấy đoạn code trên mình cũng thử viết lại với điều kiện xét tới a[i] thay vì sqrt(a[i]) với ý nghĩ nếu a[i] % j != 0 tới tận j == a[i] thì a[i] là số nguyên tố đấy, nhưng cũng k ra kết quả mà @@
Tớ giới thiệu cậu 1 vài luật nữa khi cậu cần tìm hiểu vấn đề kỹ thuật:
Nếu cậu follow các luật trên, hầu hết các vấn đề kỹ thuật đều có thể giải quyết được.
Thử bắt đầu với luật đầu tiên nhé: Cậu đang gặp vấn đề gì?
mình cảm giác sau mỗi lần đổi j thì biến đếm cũng tăng theo @@ trong khi biến đếm chỉ nên biến động khi a[i] thay đổi và laSNT = true mới đúng
Cậu cảm giác gì không quan trọng. Đây là ngành kỹ thuật, yêu cầu sự chính xác
Bắt đầu lại nhé! Cậu đang gặp vấn đề gì? Cậu có cách nào tái hiện vấn đề đó không?
int dem = 0;
bool laSNT = false;
for (int i = 0; i < n; ){
for (int j = 2; j <= sqrt(a[i]); j++){
if (a[i] % j == 0){
laSNT = false;
break;
}
if (laSNT = true)
dem++;
cout << a[i] << " ";
}
i++;
laSNT = 0;
}
cout << "So nguyen to xuat hien: " << dem;
}
lấy bài này làm ví dụ đi, mình thấy lỗi sai của mình ở chỗ đã xác định được trong code đoạn
for (int j = 2; j <= sqrt(a[i]); j++){
if (a[i] % j == 0){
laSNT = false;
break;
}
if (laSNT = true)
dem++;
cout << a[i] << " ";
}
trong for (int j; …; …) thì đoạn đếm không nằm trong vòng lặp này, nó chỉ thực thi khi j chạy tới sqrt(a[i]) && laSNT == true. Nếu dựa theo đoạn code sai này thì mỗi khi điều kiện a[i] % j != 0 thì nó cứ đếm 1 lần, mãi tới điều kiện sai của vòng lặp for j. Nên biến đếm bị tăng lên cho cùng 1 a[i].
lỗi sai thứ 2 là trong phần
if (laSNT = true)
dem++;
cout << a[i] << " ";
}
nếu để “=” nghĩa là mình gán laSNT thành true, trong khi ý nghĩ ban đầu của mình là nếu laSNT đúng dựa trên điều kiện ở phía trên thì dem++ mới được thực thi
mình thấy chỉ cần viết, tới từng đoạn cho chạy nếu chương trình compile được và thực thi ra kết quả đúng thì đoạn đó chắc chắn đúng, ví dụ như đoạn nhập khai báo mảng, nhập phần tử vào mảng, đoạn đó xong là cho chạy 1 lần, chạy đúng mới viết tiếp đoạn sau.
còn 1 cách nữa là mình so đoạn code với flowchart mình đã vẽ ra
nhưng nói chung cách này mình chưa quen, kiểu thấy viết xong rồi so lại k thấy nó đi theo flowchart. Đợi tới lúc viết đúng ra kết quả đúng rồi thì so lại mới thấy nó chạy theo flowchart
Bạn có debug từng dòng chưa ?
for (int i = 0; i < MAX; i++) // CAU CHUYEN TINH YEU (bat dau chua co' con nha!!!)
{
if (arr[i] > 2) // Song gio cuoc doi`
{
bool check = true; // Tinh yeu VAN CO`N do'
/*
Tai sao khong phai la bat dau tu 3 ma la 2 ?? hehe,
Tinh can bac hai cua 3, 4 rui se hieu
Boi vi 'j' la uoc so do' ma`
*/
for (int j = 2; j <= sqrt(arr[i]); j++) // Vong lap kiem tra tinh yeu di'ch thuc
{
if (arr[i] % j == 0) // AAAAA thang co` ho' nay co' con rieng. chia tay lien`
{
check = false; // Sau chia tay, kiem' nguoi yeu moi' vao` check tiep'
break; // Quen di nguoi yeu cu~, chuan bi quen nguoi` moi'
}
}
if (check) // Neu' van con yeu nhau
count++; // Sinh con
}
else if (arr[i] == 2) // Tieng set ai tinh`
count++; // Nhin` phat' co' con luon, khoi kiem tra hang`
Mình góp vui một tý ạ
Sorry, tớ đang bị confuse.
Tớ thấy ở đây có rất nhiều đoạn code, vậy đoạn code nào là đoạn code mới nhất của cậu? Vì có vẻ cậu lấy lại đoạn code từ đầu, vốn đã được chỉnh sửa rồi.
Chúng ta sẽ thảo luận trên đó, vì thảo luận về những vấn đề đã được giải quyết sẽ mất thời gian của tất cả. Đừng làm vậy!
Tớ hỏi lại lần cuối nhé, với code mới nhất của cậu, cậu gặp vấn đề gì vậy?
code mới nhất thì mình làm ra rồi, chẳng qua bạn bảo mình tái hiện lại vấn đề nên mới lôi đoạn code từ ban đầu để đào lỗi ấy