[Problem]

Xem công thức tính sau đây (đề thi tuyển sinh cao học ngành KHMT, năm 2011):

Trong đó Max, Min lần lượt là giá trị lớn nhất, nhỏ nhất của n số thực (được nhập vào từ thiết bị nhập chuẩn) a0, a1, …, an-1. Chỉ dùng duy nhất 1 vòng lặp (for hoặc while), đề xuất cách thức để nhập n số thực như trên và tính giá trị  của biểu thức Aver, xuất kết quả  tính ra thiết bị  xuất chuẩn. Viết chương trình để minh họa đề xuất đó.
Lưu ý: Phần này sinh viên chưa học về mảng, như vậy vấn đề chính của bài toán này là không thể dùng mảng để lưu giá trị của n số thực nói trên. Như vậy phải đề xuất một giải pháp “thông minh” để nhập và tính toán mà không đưa trước các số thực này vào mảng.

[Solution]

Nếu như không có yêu cầu cuối cùng (chỉ dùng 1 vòng lặp và không dùng mảng) thì bài toán có lẽ đã đơn giản hơn nhiều. Ý tưởng để giải bài toán này là xét xem liệu biểu thức Aver có thể được tính sau khi đã kết thúc quá trình nhập hay không?
Đầu tiên ta xét tổng:

Nếu ta khai triển (ai-Max)^2 bằng hẳng đẳng thức đáng nhớ học hồi cấp II 😛 ta được: ai^2 – 2*ai*Max + Max^2. Lúc này ta sẽ có:

  1. a0^2 + a1^2 + a2^2+  … + a(n-1)^2
  2. n*Max^2
  3. -2*Max*Sum,
    với  Sum  = a0 + a1 + a2 + … + a(n-1) <- Cái này có thể tính dễ dàng

Như vậy nhìn cái tổng có vẻ rắc rối trên bằng với: (1) + (2) + (3).
Đến đây mọi chuyện đã có vẻ khá rõ ràng. Vừa nhập vừa tính Sum và cập nhật Max, Min. Kết thúc quá trình nhập kết tất cả lại theo cách tính được nêu ra ở trên (!) 🙂

[Code]

#include <stdio.h>
#include <conio.h>
main()
{

float min, max, Aver, sum, sumbp, a;

int n;
printf(“Nhap n = “);
scanf(“%d”,&n);

printf(“Nhap a0 = “);
scanf(“%f”,&a);
max = a;

min = a;
sum = a;
sumbp = a*a;

for (int i=1; i<=n1; i++){

printf(“Nhap a%d = “,i);
scanf(“%f”,&a);
if
(min>a) min=a;

if (max<a) max=a;
sum+=a;

sumbp+=a*a;
}

Aver= n*max*max + n*min*min + 2*sumbp 2*max*sum 2*min*sum + (float)n/2*(maxmin)*(maxmin);

printf(“Aver = %f\n”,Aver);
getch();
}


Download Source Code (*.CPP)

Advertisements