01/10/2018, 00:36

Đế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 << "	" << dem;
 	system("pause");
 }
*grab popcorn* viết 02:45 ngày 01/10/2018

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.

Nguyễn Xuân Phúc viết 02:50 ngày 01/10/2018

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

tik tok viết 02:41 ngày 01/10/2018

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?

tik tok viết 02:53 ngày 01/10/2018

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

*grab popcorn* viết 02:50 ngày 01/10/2018

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

tik tok viết 02:49 ngày 01/10/2018

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

*grab popcorn* viết 02:41 ngày 01/10/2018

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

tik tok viết 02:46 ngày 01/10/2018

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

Bài liên quan
0