Code in ra các số hoàn chỉnh sai ở đâu?

Viết hàm inHoanChinh() sau, hàm này in ra các số hoàn chỉnh trong khoảng từ số đầu đến số cuối: void inHoanChinh ( int dau, int cuoi);
(Một số nguyên dương n được gọi là số hoàn chỉnh nếu tổng các ước số của n (không kể n ) bằng chính nó, ví dụ : 6, 28, 496, …

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void inHoanChinh(int dau, int cuoi)
int main()
{
int n, i, s;
int hc; //0: Không là số hoàn chỉnh, 1: Là số hoàn chỉnh (cờ hiệu)
printf("Nhap n: ");
scanf("%d", &n);
if(n < 1)
hc = 0; //Không là số hoàn chỉnh
else
    {
    //Tính tổng các ước số của n
    s = 0;
    for(i = 1; i < n; i++)
    if(n % i == 0) s += i;
        //Kiểm tra
    hc = (s == n ? 1 : 0);
    }
    //In kết quả
    {
void inHoanChinh(int dau, int cuoi)
        {
    for(i = dau; i <= cuoi; i++)
    if(hc)
    printf("Day la so hoan chinh");
    else
    printf("Day khong la so hoan chinh");
        }
    }

bạn có hàm inhoan chirng có trả về quá trị đâu mà dùng cái này :stuck_out_tongue:

bạn có thể giúp mk đc k
mk nghĩ mãi rồi mà chả bít sữa ntn

#include <iostream>
using namespace std;

bool ktra (int n)
{
	if (n < 1)
	{
		return false;
	}
	else
	{
		// tính tổng
		int s = 0;
		for (int i = 1; i < n; i++)
		{
			if (n % i == 0)
			{
				s += i;
			}
		}
		if (s == n)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
int main ()
{
	int a;
	cout << "nhap a: ";
	cin >> a;
	cout << endl;   // enter line
	int hc;
	if (ktra(a))
	{
		hc = 1; // éo biết hc để làm gì luôn nhưng thấy ô vueets thì chắc cần
		cout << "la so hoan thien"<< endl;
	}
	else
	{
		hc =0;
		cout << "khong phai la so hoan thien"<<endl;
	}
	system("pause");
	return 0;
}

đã vi pham nội quy diễn đàn r , tham khảo bài này

mk cam ơn b
đây là c hay C++ vậy

C++ bạn nhé , cin = scanf , cout = print bên bạn , code lại theo C xem

code của bạn nhiều chỗ sai quá.
Thứ 1: for(i = 1; i < n; i++)

  • trong hàm for thì phải khai báo biến i nhé: for(int i = 1; i < n; i++)

Thứ 2:

void inHoanChinh(int dau, int cuoi)
{
for(i = dau; i <= cuoi; i++)
if(hc)
printf("Day la so hoan chinh");
else
printf("Day khong la so hoan chinh");
}
}
  • Biến hc ở đây là biến cục bộ trong hàm main nên trong hàm inHoanChinh() không sử dụng được.
  • Và mục đích của hàm này chỉ là in ra 2 dòng: “Day la so hoan chinh” hoặc “Day la so khong hoan chinh”

Thứ 3: Mình chỉ mới đọc code thôi nhưng mình nghĩ thuật toán của bạn cho bài này chưa chính xác. Nếu bạn muốn thì mình có thể viết lại cho bạn

ban có thể viết lại cho mk đc k
mk tham khảo

#include<stdio.h>
int hc = 0;
void kiemTraSoHoanChinh(int soCanTimUocSo){
    int tongUocSo = 0;
    for(int i = 1; i < soCanTimUocSo; i++){
        if(soCanTimUocSo % i == 0) 
            tongUocSo += i;
    }
    hc = (tongUocSo == soCanTimUocSo ? 1 : 0);
    
    
}
int main(){
    int soDau,soCuoi;
    printf("Nhap so dau: ");
    scanf("%d", &soDau);
    
    printf("Nhap so cuoi: ");
    scanf("%d", &soCuoi);
    
    for(int i = soDau ; i <= soCuoi ; i++){
        kiemTraSoHoanChinh(i);
        if(hc == 1){
            printf("so hoan chinh la %d", i);
            printf("--");
        }
        
    }
    
}

không hiểu chỗ nào thì hỏi mình nhé

for(int i = 1; i < soCanTimUocSo; i++)
nó báo lỗi chỗ này là sao b

bạn đã include stdio chưa

mk khai báo biến i ở ngoài thì mới đk

kết quả thế này

mk dùng codeblock
chác nó khác cái dev này

cái đó thì mình không biết. Sau khi khái báo biến i ở ngoài thì nó có ra kết quả không

6 posts were merged into an existing topic: Bài tập về cấu trúc rẽ nhánh

1 Like

có ra kết quả b à cảm ơn b nhiều

Tag @drgnz @moderators vì topic này trùng với topic: Các bác xem giúp e code này vs
Có merge topic được không nhỉ?

Và cmt này: Cho e hỏi sai chỗ nào vậy cũng không liên quan với bài này.
cmt này trùng topic https://daynhauhoc.com/t/bai-tap-ve-cau-truc-re-nhanh/49414.

1 Like

Mình nghĩ chỗ nào có mâu thuẫn

void inHoanChinh(int dau, int cuoi)
{
    for(i = dau; i <= cuoi; i++)
    {
        if(hc) // hc? Nó ở đâu ra đây?
        printf("Day la so hoan chinh");
        else
        printf("Day khong la so hoan chinh");
    }
}

Mình nghĩ nên cho đoạn này vào một hàm gọi là int ktHoanChinh(int n). return 0 if not hc else return 1
Khi đó thì trong hàm inHoanChinh bạn sẽ kiểm tra từng số một trong dãy đầu đến cuối. if (ktHoanChinh(i)) // same as ktHoanChinh == 1

mk vẫn chưa hiểu yk bạn

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