30/09/2018, 16:23

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 : 
");
    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!!!
");
    else
        printf("Mang khong doi xung !!!
");
    printf("Tong cac so nguyen to trong mang la %d",t);
    return 0;
}
Nguyễn Duy Khánh viết 18:35 ngày 30/09/2018

    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

Pham Anh viết 18:35 ngày 30/09/2018

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

Nguyễn Duy Khánh viết 18:26 ngày 30/09/2018

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

Pham Anh viết 18:32 ngày 30/09/2018

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

Nguyễn Duy Khánh viết 18:27 ngày 30/09/2018

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

Nguyễn Duy Khánh viết 18:34 ngày 30/09/2018

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

Pham Anh viết 18:29 ngày 30/09/2018

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…!!!

Nguyễn Minh Dũng viết 18:35 ngày 30/09/2018

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.

X viết 18:30 ngày 30/09/2018
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 @@

X viết 18:26 ngày 30/09/2018

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

Pham Anh viết 18:40 ngày 30/09/2018

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 ???

Nguyễn Minh Dũng viết 18:29 ngày 30/09/2018

Đã 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é

#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
Pham Anh viết 18:28 ngày 30/09/2018

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 ạ.

X viết 18:31 ngày 30/09/2018
#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 {}

X viết 18:32 ngày 30/09/2018

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

Nguyễn Duy Khánh viết 18:26 ngày 30/09/2018

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

Bài liên quan
0