Hàm tính giá trị trung bình số hoàn hảo trong mảng C/C++

0
1426
ham tinh gia tri trung binh so hoan hao 1

Bài toán về số hoàn hảo là một dạng bài toán khá hay. Trong bài viết này, mình sẽ giúp các bạn giải quyết bài tập viết hàm tính giả trị trung bình các số hoàn hảo trong mảng bẳng một chiều bằng ngôn ngữ c.

1. Giới thiệu bài toán

Một bài toán liên quan đến số hoàn hảo. Bài toán cần sử dụng tương đối nhiều các kiến thức về ngôn ngữ lập trình C như : Mảng, vòng lặp (for, while. . ), các cấu trúc điều kiện (if, else. . .).

Đây là bài toán mình đánh giá ở mức cơ bản, nên chắc chắn bạn sẽ làm được sau khi tham khảo bài viết này.

Đề bài:

Viết hàm tính giá trị trung bình các số hoàn hảo trong mảng một chiều a có n phần tử. Hàm trả về giá trị trung bình của các phần tử là số hoàn hảo. Ngược lại hàm trả về giá trị 0.

2. Giải quyết bài toán

Với bài toán này bạn cần nắm được một chút kiến thức về số hoàn hảo. Nắm được cú pháp của ngôn ngữ C là hoàn toàn giải được.

2.1 Ý tưởng giải quyết

Đề giải được bài toán, trước tiên bạn phải hiểu định nghĩa thế nào là số hoàn hảo?

Số hoản hảo là số có tổng các ước thật sự của nó bằng chính nó

Ví dụ số 6 là số hoàn hảo vì:

Các ước thật sự của số 6 là: 1, 2, 3 (lưu ý không tính chính nó nhé). Tổng của 1+2+3=6 (bằng chính nó)

Số 12 không phải là số hoàn hảo vì: tổng các ước của 12 khác 12: 1+2+3+4+6=16

Ví dụ về các số hoàn hảo: 6, 28, 496, . . .

Dựa vào định nghĩa trên ta sẽ viết hàm kiểm tra một số nguyên có phải là số hoàn hảo hay không. (hàm này sẽ trả vể giá trị đúng, sai 1-0)

Sau khi viết hàm kiểm tra số hoàn hảo, chúng ta sẽ viết hàm tính giá trị trung bình các số hoàn hảo trong mảng c.

2.2 Code C gợi ý giải quyết bài toán

2.2.1 Hàm kiểm tra số hoàn hảo bằng ngôn ngữ c

Hàm này sẽ trả về giá trị đúng sai (1 tương đương với đúng, 0 tương đương sai) nên mình sẽ dùng kiểu int.

Thuật toán:

  • Khai báo một biến tổng để tính tổng các giá trị là ước thật sự của số đó (sau đó dùng so sánh )
  • Dùng vòng for duyệt từ 0 cho đến n/2 tìm các ước của n. Nếu thấy, cộng vào tổng
  • Sau khi duyệt hết vòng for, nếu biến tổng = với n. Đúng return 1 , sai return 0 .
int ktrashh(int n){
    int tong=0;
    for(int i=1;i<=n/2;i++)
    	if(n%i==0)
    		tong=tong+i;
    if(tong==n)
    	return 1;
    else
    	return 0;
}

như vậy là đã xong phần hàm kiểm tra số hoàn hảo trong c.

2.2.2 Hàm tính trung bình các số hoàn hảo trong mảng code C

Hàm tính trung bình trả về số thực nên sẽ là kiểu float.

Mình sẽ dùng 3 biến, một biến tổng, một biến trung bình, một biến đếm.

Khi duyệt mảng nếu thấy phần tử thỏa mãn là số hoàn hảo, cộng số đó vào tổng và tăng biến đếm thêm 1 đơn vị.

cuối cùng gán trung bình bằng tổng chia đếm.

Nếu đếm =0 tức là không có giá trị hoàn hảo nào, hàm trả về 0.

Code c:

float tinhtb(int a[], int n){
	float tb, tong=0;
	int dem=0;
	for(int i=0;i<n;i++){
		if(ktrashh(a[i])){
			tong=tong+a[i];
			dem++;
		}
	}
	
	if(dem==0)
		return 0;
	else
		{
			tb=tong/dem;
			return tb;
		}
}

2.2.3 Chương trình hoàn chỉnh

Chương trình cần phải kết hợp cả phần nhập xuất mảng, các cấu trúc mặc định của ngôn ngữ C.

Xem Nhập xuất mảng trong C

Code C:

#include<stdio.h>
void nhap(int a[], int &amp;n){
	do{
		printf("Nhap n: ");
		scanf("%d",&amp;n);
	}
	while(n<2||n>99);
	
	for(int i=0; i<n; i++){
		printf("a[%d]: ",i);
		scanf("%d",&amp;a[i]);
	}
}

void xuat(int a[], int n){
	printf("Mang vua nhap la: \n");
	for(int i=0;i<n;i++){
		printf("%5d",a[i]);
	}
}

int ktrashh(int n){
    int tong=0;
    for(int i=1;i<=n/2;i++)
    	if(n%i==0)
    		tong=tong+i;
    if(tong==n)
    	return 1;
    else
    	return 0;
}

float tinhtb(int a[], int n){
	float tb, tong=0;
	int dem=0;
	for(int i=0;i<n;i++){
		if(ktrashh(a[i])){
			tong=tong+a[i];
			dem++;
		}
	}
	
	if(dem==0)
		return 0;
	else
		{
			tb=tong/dem;
			return tb;
		}
}
int main(){
	int a[100];
	int n;
	nhap(a,n);
	xuat(a,n);
	printf("\nGia tri trung binh la: %0.2f",tinhtb(a,n));	
	return 0;
}

Khi chạy chương trình bên trên sẽ cho kết quả như sau:

ham tinh gia tri trung binh so hoan hao 2

trong ví dụ trên có 3 số hoàn hảo là 6, 28 và 496. Tổng của 3 số là 530 và kết qủa của phép chia 530/3 làm tròn đến phần thập phân thứ 2 là: 176.67

ham tinh gia tri trung binh so hoan hao 3

Một ví dụ về nhập vào mảng không có giá trị nào thỏa mãn là số hoàn hảo:

ham tinh gia tri trung binh so hoan hao 4

2.3 Code C++ giải quyết bài toán tính giá trị trung bình số hoàn hảo

Về mặt thuật toán giải quyết bài toán không có khác biệt, mình sẽ không nhắc lại nữa.

Mời bạn tham khảo chương trình dưới đây:

#include<bits/stdc++.h>
using namespace std;
void nhap(int a[], int &amp;n){
	do{
		cout<<("Nhap n: ");
		cin>>n;
	}
	while(n<2||n>99);
	
	for(int i=0; i<n; i++){
		cout<<"a["<<i<<"]: ";
		cin>>a[i];
	}
}

void xuat(int a[], int n){
	cout<<"Mang vua nhap la:\n";
	for(int i=0;i<n;i++){
		cout<<"  "<<a[i];
	}
}

int ktrashh(int n){
    int tong=0;
    for(int i=1;i<=n/2;i++)
    	if(n%i==0)
    		tong=tong+i;
    if(tong==n)
    	return 1;
    else
    	return 0;
}

float tinhtb(int a[], int n){
	float tb, tong=0;
	int dem=0;
	for(int i=0;i<n;i++){
		if(ktrashh(a[i])){
			tong=tong+a[i];
			dem++;
		}
	}
	
	if(dem==0)
		return 0;
	else
		{
			tb=tong/dem; 
			return tb;
		}
}
int main(){
	int a[100];
	int n;
	nhap(a,n);
	xuat(a,n);
	cout<<"\nGia tri trung binh la: "<<setprecision(2)<<fixed<<tinhtb(a,n);	
	return 0;
}

Các bạn có thể tham khảo video sau của mình để hiểu rõ hơn nhé!

Bài viết của mình đến đây là kết thúc, cảm ơn bạn đã quan tâm bài viết, đừng bỏ lỡ những bài tiếp theo nhé!

Xem tiếp Bài 6: Hàm tính giá trị trung bình số chính phương bằng code C/C++

Xem lại Bài 4: Hàm tính giá trị trung bình các số nguyên tố trong mảng C

Tải về đề cương nhập môn lập trình

Trong quá trình tham khảo bải viết, bạn đọc có thắc mắc, khó khăn gì, comment xuống phía dưới bài viết để các admin hỗ trợ nhé!

Rất mong nhận được ý kiến đóng góp của bạn đọc về (thuật toán, cách trình bày . . .) để bài viết của mình được hoàn thiện hơn.

LEAVE A REPLY

Please enter your comment!
Please enter your name here