Khi in số bé hơn số nguyên tố, tại sao lại in ra 2 lần trùng?

Bài toán nhập n in ra số nguyên tố bé hơn n.
Dạ cho mình hỏi là tại sao khi in ra màn hình nó lại ra 2 số trùng vậy ạ vấn để của mình là ở hàm sobehon và hàm songuyento ạ. Cụ thể là trong vòng lập while khi mình nhập “3” thì nó sẽ in ra “22” cho mình hỏi là tại sao lại như vậy ạ?
Mình có coi qua cách giải trên mạng rồi ạ. Mình có thắc mắc là sao code mình nó lại như vậy?

#include<iostream>
using namespace std;
int songuyento(int n);
void sontbehon(int n);
int main()
{
	int n;
	cin>>n;
	sontbehon(n);
	return 0;
}

void sontbehon(int n) //Hàm ở đây để in ra số bé hơn
{
	int u;
	int i=1;
	while(i<n)
	{
		u=songuyento(i);
		cout<<u<<endl;
		i++;
	}
}


int songuyento(int n)  //Hàm kiểm tra số nguyên tố
{
	int i=1;
	int sum=0;
	while(i<=n)
	{
		if(n%i == 0)
		{
			sum=sum+1;
		}
		i++;
	}
	if(sum == 2)
	{
		return n;
	}
}

Hàm này có ý nghĩa gì vậy bạn?

Sau dòng lệnh này, giá trị biến u là gì?

1 Like

Dạ mình nghĩ khi gắn kiến u vào thì khi cho i ở hàm sobehon chạy vào hàm songuyento sẽ return lại i và mình đặt u=songuyento(i) để nhận giá trị return ạ.

u=songuyento(i)
Vậy hàm trên nhận vào i, trả về cái gì?

3 Likes

trả lại cái giá mà nó cho i vào sau khi kiểm tra số nguyento, ạ

Bạn mô tả rõ ràng hơn xem

Hàm đó nhận vào một số nguyên
Hàm đó kiêtm trả số nguyên đó có phải là nguyên tố hay không
Nếu là số nguyên tố thì trả về cái gì, nếu không phải số nguyên tố thì trả về cái gì?

Code của bạn đã hoàn thàbh 90%, chỉ cần sửa tí xíu nữa là xong rồi

4 Likes

Dạ nếu là số nguyên tố thì mình trả về số đó ạ, còn không phải thì không trả về gì cả nên mình dùng return lại số nguyên tố đó (ở hàm songuyento), nhưng mình không hiểu tại sao mình lại cho u ở hàm sobehon nhận ngược lại cái giá trị sau khi kiểm tra đó là số nguyên tố thì nó lại in ra lập lại số đó 2 lần ạ.
VD input 3 --> output thì ra 22 thay vì chỉ có 2

Hàm là chắc chắn phải có trả về

ý tưởng bài này thì đơn giản thôi
cho i chạy từ 1 đến n - 1 (này for hay while đều được, bạn đang dùng while cũng không sao)
với mỗi i, nếu là số nguyên tố thì in số i đó ra, không phải thì thôi, không làm gì

vậy thì sửa lại

if (songuyento(i)) cout<<i<<endl; // hàm songuyento sửa lại trả về true/false
5 Likes

À mình hiểu rồi vậy là hàm thì sẽ phải có trả về nếu không thì nó sẽ trả về giá trị nào đó ạ. Cảm ơn ạ !

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