Tính tổng các số nguyên tố trong mảng?

Trong bài em có sử dụng tham chiếu &n của C++. anh @ltd và mọi người giúp em xem đoạn code lỗi thế nào với ạ.

#include<stdio.h>
#include<conio.h>
void nhapmang(int a[],int &n) {
    int i;
    printf("Nhap so luong phan tu cua mang : \n");
    scanf("%d",&n);
    for(i=0; i<n; i++) {
        printf("Phan tu thu %d : ",i+1);
        scanf("%d",&a[i]);
    }
}
int KtDoiXung(int a[],int n) {
    int i;
    for(i=0; i<n-1; i++)
        if(a[i]==a[n-1-i])
            return 1;
        else
            return 0;
}
int KTSoNguyenTo(int p) {
    int i,dem =0;
    for(i=1; i<p; i++) {
        if(p%i==0)
            dem++;

        if(dem==2)
            return 1;
        else
            return 0;
    }
}
int tongnt(int a[],int n) {
    int i;
    int tong=0;
    for(i=0; i<n; i++) {
        if(KTSoNguyenTo(a[i])==1) {
            tong+=a[i];
        }
    }
    return tong;
}
int main() {
    int a[100];
    int n;
    int t=tongnt(a,n);
    nhapmang(a,n);
    if(KtDoiXung(a,n))
        printf("Mang doi xung!!!\n");
    else
        printf("Mang khong doi xung !!!\n");
    printf("Tong cac so nguyen to trong mang la %d",t);
    return 0;
}
1 Like

    int KTSoNguyenTo(int p){
     int i,dem =0;
        for(i=1;i&lt;p;i++){
            if(p%i==0)
                dem++;
        }
        if(dem==1)
            return 1;
        else
            return 0;
    }

bạn chạy thử xem có đc ko

1 Like

Ờ.đúng rồi,mình nhầm, nhưng sao vẫn không chạy được. :frowning:

post cụ thể lỗi gì bạn

this application has failed to start because dbgeng.dll was not found

Xem lại hàm main nhé, nhapmang phải trên tinhtong;
lệnh rẽ nhánh ko có ĐK à

1 Like

đúng r đó bạn, mình ko để ý bạn code c;
hàm KtDoiXung cũng sai, bạn xem lại nhé

Mình đã nói mình sử dụng tham chiếu &n trong C++ rùi mà.Hàm KTDoiXung đâu sai đâu.Có cái hàm tính tổng kiểu gì á.Hic…!!!

Hàm này có vấn đề rồi @Su_Su

int KTSoNguyenTo(int p) {
    int i,dem =0;
    for(i=1; i<p; i++) {
        if(p%i==0)
            dem++;

        if(dem==2)
            return 1;
        else
            return 0;
    }
}

Điều kiện này không đảm bảo hàm KTSoNguyenTo luôn return, nếu nó không chui vào for thì nó không return.
Tương tự cho hàm KtDoiXung
Để xem tiếp các hàm khác.

Hàm KTSoNguyenTo chạy không đúng rồi. Nó không tìm ra được số nguyên tố. @Su_Su kiểm tra lại.

1 Like
bool KTSoNguyenTo(int p){
	if(p<2){
		return false;
	}
	else if(p>2){
		if(p%2 == 0){
			return false;
		}
		for(int i=3; i<=sqrt(float(p)); i+=2){
			if(p%i == 0){
				return false;
			}
		}
	}
	return true;
}

hàm kiểm tra nguyên tố của bn trông rất nguy hiểm @@

2 Likes

kiểm tra đối xứng có vẻ đúng rồi :v

1 Like

int KTSoNguyenTo(int p) {
int i,dem =0;
for(i=1; i<=p; i++) {
if(p%i==0)
dem++;
}
if(dem==2)
return 1;
else
return 0;

}

@david15894 Thế này đc chưa ???

Đã thay hàm kiểm tra số nguyên tố, @Su_Su kiểm tra lại xem còn sai chỗ nào thì sửa tiếp nhé :smile:

#include <stdio.h>
#include <math.h>

void nhapmang(int a[],int &n) {
    int i;
    printf("Nhap so luong phan tu cua mang : \n");
    scanf("%d",&n);
    for(i=0; i<n; i++) {
        printf("Phan tu thu %d : ",i+1);
        scanf("%d",&a[i]);
    }
}

int KtDoiXung(int a[],int n) {
    int i;
    for(i=0; i<n-1; i++)
        if(a[i]==a[n-1-i])
            return 1;
        else
            return 0;
    return 0;
}

int KTSoNguyenTo(int soA) {
    if (soA < 2)
        return 0;

    for (int i = 2; i <= sqrt((float)soA); i ++) {
        if (soA%i==0) {
            return 0;
        }
    }
    return 1;
}

int tongnt(int a[],int n) {
    int tong = 0;
    for(int i = 0; i < n; i++) {
        if(KTSoNguyenTo(a[i])) {
            tong += a[i];
        }
    }
    return tong;
}

int main() {
    int a[100];
    int n;

    nhapmang(a,n);
    int tong = tongnt(a,n);
    if(KtDoiXung(a,n))
        printf("Mang doi xung!!!\n");
    else
        printf("Mang khong doi xung !!!\n");

    printf("Tong cac so nguyen to trong mang la %d",tong);
    return 0;
}

P/S: Các điểm cần lưu ý

  1. Hạn chế sử dụng if mà không có dấu {}, lý do ở đây
  2. Nhớ đặt khoảng trống giữa các phép so sánh và gán
  • a=1 thay bằng a = 1
  • a>b thay bằng a > b
  1. Đừng đặt tên biến một ký tự
  • t thay bằng tong
2 Likes

Cảm ơn anh @ltd và mọi người.Em thấy hàm kiểm tra số nguyên tố của em khi chỉnh lại mấy cái { } cũng được mà,đâu có nguy hiểm giống @david15894 nói đâu. Nhân đây anh Đạt cho em hỏi làm sao để thay cái &n mà giá trị của nó vẫn giũ nguyên khi dùng ở hàm khác.Em cảm ơn ạ.

#include <iostream>
using namespace std;
#define MAX 100

void ArrayIn(int a[], int number){
	for(int i=0; i<number; i++){
		cin >> a[i];
	}
}

void ArrayOut(int a[], int number){
	for(int i=0; i<number; i++){
		cout << a[i] << "  ";
	}
	cout << endl;
}

bool CheckPrime(int number){
	if(number < 2){
		return false;
	}
	else if(number > 2){
		if(number%2 == 0){
			return false;
		}
		for(int i=3; i<=sqrt(float(number)); i+=2){
			if(number%i == 0){
				return false;
			}
		}
	}
	return true;
}

bool CheckPal_Array(int a[], int number){
	for(int i=0; i<number; i++){
		if(a[i] != a[number-1-i]){
			return false;
		}
	}
	return true;
}

int PrimeSum(int a[], int number){
	int sum = 0;
	for(int i=0; i<number; i++){
		if(CheckPrime(a[i]) == true){
			sum += a[i];
		}
	}
	return sum;
}
int main()
{
	int a[MAX], n;
	cout << "Input the number N = ";
	cin >> n;
	ArrayIn(a, n);
	ArrayOut(a, n);
	
	int sum = PrimeSum(a, n);
	cout << "SUM cac so Nguyen to: " << sum << endl;

	bool pal = CheckPal_Array(a, n);
	cout << "Doi xung: ";
	if(pal){
		cout << "YES";
	}
	else
	{
		cout << "NO";
	}
	cout << endl;

	return 0;
}

trông nguy hiểm vì không dùng {}

0 -> n/2 thì kiểm tra thế nào ??? :wink:

0 -> n/2 được mà a tương tự 0 -> n , bài snt có 4 cách lận

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