Dãy số không đẹp. Thắc mắc sử dụng lệnh continue

Chương trình yêu cầu kiểm tra xem số nhập vào có phải là Số không đẹp hay không. Số không đẹp là số chỉ có Thừa số nguyên tố là 2,3,5. Ví dụ như 12 là số không đẹp còn 21 thì không phải.
Ý tưởng của em là tạo 1 cái hàm, chia số được nhập vào lần lượt cho 2,3,5. Bắt đầu sẽ chia cho 2 đến khi không chia được nữa sẽ chia cho 3, và tiếp tục. Nếu như chia cho cả 2,3,5 mà kết quả phép chia vẫn không bằng 1 thì sẽ hiểu là nó còn có một ước khác 2,3,5 và nó không phải là số không đẹp.
Em chỉ mới học các cấu trúc điều khiển và hàm nên chỉ áp dụng được như vậy, test thử vài kết quả thì nó đúng nhưng khi upload lên web thì nó báo Kết quả sai. Em nghĩ mình dùng lệnh Continue không đúng. Mong mọi người giúp với. Em cám ơn.

#include <stdio.h>

int uoc (int n)
{
	if (n==1)
		return 1;
	else
	{	while (n!=1)
		{	if(n%2==0)
				{n = n/2;
				if (n==1)
				return 1;
				else
				continue;}
			else if (n%3==0)
				{n = n/3;
				if (n==1)
				return 1;
				else
				continue;}
			else if (n%5==0)
				{n = n/3;
				if (n==1)
				return 1;
				else
				continue;}
			else
				return 0;
			
		}
		
	}
	
}
int main ()
{	int n;
	printf ("Nhap n= ");
	scanf("%d", &n);
	if (uoc(n)==1)
		printf ("YES");
	else
		printf ("NO");
}

Chưa nói đến giải thuật, sai ngay ở đầu hàm:

if(n=1)

Hãy xem lại phép toán so sánhgán. Khác nhau chỗ nào?

2 Likes

à, cám ơn bạn. Mình kiểm tra bị sót chỗ này.

continue là nhảy xuống CUỐI VÒNG LẶP

for (/* ... */) {
    // ...
    continue; // giống goto contin;
    // ...
    contin:;
}
1 Like

Nên làm kiểu quay 3 cái while (hoặc 2 vòng lặp lồng :smiley: ). Kiểu lọt sàng thì xuống nia.

À mà mod p thì phải chia p chứ :slight_smile:

3 Likes

à. em đọc sách thì hiểu continue là bỏ qua những câu lệnh dưới nó để quay về vòng lặp gần nhất và tiếp tục lặp. Ý anh là continue nhảy xuống cuối rồi thoát vòng lặp ấy ạ?

em có chia ngay trong if, ý anh là phép chia đấy phải không?
lặp lần tiếp theo tức là nó sẽ giữ “n” đã được chia rồi tiếp tục lặp đúng không ạ

Thoát vòng lặp là break;. Còn continue; là lặp thêm lần nữa, chi tiết ntn:

  • For và while: Điều kiện lặp được kiểm tra rồi mới lặp tiếp.
  • Do {} while: Điều kiện lặp bị bỏ qua, vòng lặp chạy thêm 1 lần.
1 Like

cái đấy em có biết. Chỉ là em xem lại vẫn không biết sai chỗ nào, vì nếu em nhập vào số nhỏ ví dụ từ 1-20 thì kết quả trả về vẫn đúng. Nhưng nếu em nhập 1000,2000 nó lại báo No.
chắc để em đổi qua while thử xem.
em cám ơn.

em tìm ra chỗ sai rồi ạ. em cám ơn.

else if (n%5==0)
				{n = n/3;
				if (n==1)
				return 1;

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

1 Like

Tức là ntn:

bool isNice(uint32_t n) {
   while(!n%2) n/=2;
   if(n == 1) return true;
   while(!n%3) n/=3;
   if(n == 1) return true;
   while(!n%5) n/=5;
   return n == 1;
}

Flow: khởi tạo -> (kiểm tra -> chạy)+, continue tức là chỉ cái flow này.

p/s: bài này hao hao FizzBuzz.

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