Thứ Bảy, 24 tháng 11, 2012

Tinh Aver


Bài 2: 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.
Bài giải

I. Phân tích yêu cầu
   - Input: n số thực
   - Output: Aver


II. Đi tìm lời giải
   - Do yêu cầu đề bài là chỉ dùng một vòng lặp nên ta không thể tính trực tiếp bằng công thức mà đề bài đã cho được. Vì vậy chúng ta phải biến đổi công thức một xíu để thuận tiện tính toán hơn. Chúng ta biến đổi như sau:


    Bây giờ chúng ta có thể thấy được rằng với công thức này, ta sẽ tính tổng a^2 và tổng a trước, sau khi chúng ta tìm được max, min rồi thì chúng ta sẽ ráp vào công thức mà tính.

    Cụ thể ta sẽ làm các bước sau:
1. Dùng 1 vòng lặp nhập n số thực a:
    - Tính tổng các bình phương của a: sumSqrA
    - Tính tổng a: sumA
    - Tìm max: max
    - Tìm min: min
2. Sau đó chúng ta chỉ việc ráp theo công thức là đáp án hiện ra ngay.

III. Source
  1. Phần khai báo


  
  2. Hàm Main


  3. Hàm InputN

  4. Hàm InputData
  5. Hàm calculateAver

   6. Tổng Hợp Code
// Library Declaration
#include <stdio.h>
#define Max 1000000000

// Prototype
void nhapA(long &a);
long tichThuaSoNgto(long a, int &max);  // ham tinh tich cac thua so nguyen to va so mu cao nhat
int timN(long M, int max);

// Main body
void main()
{
        // variable declaration
        long a;
        int max = 0;    // bien luu so mu cao nhat
        int n;                  // n can tim

        // nhap vao a
        nhapA(a);

        // tinh tich thua so cac nguyen to luu vao bien M
        long M = tichThuaSoNgto(a, max);

        // tim n roi luu vao bien n
        n = timN(M, max);

        // xuat ra man hinh thong bao
        printf("\n%d la so nho nhat thoa: %d^%d chia het cho %ld\n\n", n, n, n, a);
}

// Function Definition
void nhapA(long &a)
{
        do
        {
                printf("\nNhap  0 < a <= 1000000000: ");
                scanf("%ld", &a);
        }
        while (a < 1 || a > Max);
}

long tichThuaSoNgto(long a, int &max)
{
        long p = 1; // tich cac thua so nguyen so cua a
        int i = 2;

        while (i <= a)
        {
                if (a % i == 0) // neu a chia het cho i, thi i la thua so nguyen to cua a.
                {
                        p = p * i;      // vi the ta lay p nhan voi i, roi luu lai cho bien p

                        int dem = 0;    // bien luu so mu cua thua so nguyen to i
                        while (a % i == 0)
                        {
                                dem++;
                                a = a / i;
                        }
                       
                        if (dem > max)  // neu so mu > max hien tai thi max = so mu do
                                max = dem;     
                }
                i++;
        }

        return p;
}

int timN(long M, int max)
{
        // chay i tu 1 toi khi ma bieu thuc: i * M >= max thoa.
        int i = 1;
        while (i * M < max)
                i++;

        return (i * M);
}

Cảm ơn các bạn đã giành thời gian đọc bài viết này. Mọi góp ý xin vui lòng để lai comment hoặc liên hệ trực tiếp mình qua: nguyenvanhauesmn@gmail.com
Rất mong nhận được sự đóng góp của các bạn.



Chúc các bạn vui vẻ!!!

Không có nhận xét nào:

Lên đầu trang
Xuống cuối trang