Đếm n số chính phương đầu tiên (n nguyên dương)

Đề bài : nhập số nguyên dương n (n>0).tìm n số chính phương đầu tiên.e xem mãi mà không tìm ra lỗi sai mong mọi người giúp e với.
code:

#include <iostream>
using namespace std;
 //nhap so nguyen duong n
 void input(int &n)
 {
 	do
 	{
 		cout << "nhap so nguyen duong n= ";
 		cin >> n;
 	} while (n <= 0);
 }
 //kiem tra so chinh phuong
 int SoCP(int n)
 {
 	if (n < 4)
 		return 0;
 	int a = (int)sqrt((float)(n));
 	if (a*a == n)
 		return 1;
 	return 0;
 }
 //dem n so chinh phuong
 int dem(int n)
 {
 	int i = 1;
 	int demso = 0;
 	while (demso <= n)
 	{
 		for (int j = 1; j <= i; j++)
 		{
 			if (SoCP(j) == 1)
 			{
 				demso++;
 			}
 			return i;
 		}
 		i++;
 	}
 }

 // xuat gia tri ra ngoai man hinh
 void main()
 {
	int n;
 	input(n);
 	dem(n);
 	cout << "\t" << dem;
 	system("pause");
 }

Sai ở đoạn sau:

        for (int j = 1; j <= i; j++)
	{
		if (SoCP(j) == 1)
		{
			demso++;
		}
		return i;
	}
	i++;

Khi hàm return, thì nó ko thực hiện nữa.
Ở trên với j = 1 nó là số chính phương -> nó return i và không thực hiện vòng lặp nữa. Dẫn tới sai kq.

1 Like

ủa, n số chính phương đầu tiên là 1^2 + 2^2 + … + n^2 mà?
làm chi cực thế

1 Like

bạn ơi mình để đk là n<4 thì return 0 rồi nên nếu j=1 thì không in ra kết quả, mà mình thử dùng hàm void để khai báo đếm thì nó cũng không ra, nếu có thể sửa giúp mình hay chỉ ra lỗi rõ hơn 1 tý được không?

cảm ơn bạn, ý tưởng hay để mình source lại, có vẻ như sẽ khỏe hơn rất nhiều

Ở trên mình nói hơi sai chút.
Nói chung, khi vô vòng lặp for ngay khi j = 1, ko cần check nó là số chính phương hay ko. Thì có dòng return, khi tới gặp dòng đó nên nó trả về hàm luôn và ko thực hiện nữa.

1 Like

đã cố gắng sửa nhưng vẫn không chạy được, bạn có thể sửa giúp mình được không? :joy:

Code bạn sai hơi nh lỗi.
1/ return trong for v nên hàm chưa làm xong đã tịt
-> Đặt return i cuối thân hàm. Mà mình cũng ko rõ là bạn viết thuật ntn mà dùng tới i?? Nên xin phép sửa lại thành ntn

int dem(int n) {
	int demso = 1; 
	for (int j = 1; j <= n; j++) {
		if (SoCP(j) == 1) {
			demso++;
		}
	}
	return demso;
}

(Bạn có thể lấy ý tưởng của a nxphuc để code cũng được)

2/ Bạn gọi hàm mà ko gán giá trị trả về cho nó, rồi lại in ra tên hàm nên sai lần nữa.
-> Gán giá trị trả về cho 1 biến bất kỳ và in ra

1 Like

cảm ơn bạn, mình dùng thuật của anh nxphuc thi ra rồi nhưng vẫn muốn sửa cái code do mình viết :smile:

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