Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Квадратная матрица - среднее геометрическое положительных элементов (http://forum.oszone.net/showthread.php?t=126844)

q23p 23-12-2008 22:36 988497

Квадратная матрица - среднее геометрическое положительных элементов
 
Доброго времени суток!

Прошу, как говорится, помощи :)

В университете задали несколько задач, а у меня совсем нет времени - как раз нагрузили работой, и так ничего не успеваю. Плюс дома нет билдера, и где его найти в 11 часов вечера, с моим инетом 64кб - хз.
У кого время есть, черкните код, буду очень благодарен.

Суть задачи:
Для квадратной матрицы от 4х4 до 10х10 найти среднее геометрическое положительных элементов первой четверти, т.е. элементов, расположенных в верхней половине матрицы между диагоналями.

Кто откликнется - заранее спасибо :) Желательно до завтра, максимум - до четверга..

mrcnn 25-12-2008 09:28 989740

Элементы первой четверти, то есть элементы между главной и побочной диагональю?

n - количество элементов первой четверти
Среднее геометрическое это произведение корней n степени из этих элементов

Если сначала все перемножать, то понадобится длинная арифметика. Т.к результат умножения в long не влезет. Так что я сразу вычисляю корни.


Как-то так. Корректность не гарантирую.

Код:

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <math.h>

#define XYZZ 10 // размерность квадратной матрицы

void print_matrix(int **m);
void random_matrix(int **m);
double geom(int **m, int sz);

void main()
{

        double mn;
        int size=XYZZ;
        int** matrix;
        matrix = new int*[size];

        for(int k=0;k<size;k++)
                {
                matrix[k]=new int[size];
                }

        random_matrix(matrix);
        print_matrix(matrix);
        mn=geom(matrix,XYZZ);
        printf("%f\n",mn);
}

void print_matrix(int **m)
{
        int i,j;

        for (i=0 ; i<XYZZ; i++)
                {
                        for (j=0; j<XYZZ;j++)
                        {
                                printf("%d ", m[i][j]);
                        }
                        printf("\n");
                }
}

void random_matrix(int **m)
{
        int i,j;
        srand (time(NULL));

        for (i=0 ; i<XYZZ; i++)       
                for (j=0; j<XYZZ;j++)               
                        m[i][j]=rand()%10;
}


double geom(int **m, int sz)
{
        double result;
        int gap_x,gap_y,a,b,i,sk;


        //------------Определение корень какой степени нужно вычислить
        sk=0;
        gap_x=1;
        gap_y=XYZZ-2;

        for(i=0;i<XYZZ && gap_x<=gap_y;i++,gap_x++,gap_y--)
        {
                for(a=gap_x,b=gap_y;a<b;a++,b--)
                {
                        if(m[i][a]>0)                       
                                sk++;                       
                        if(m[i][b]>0)                       
                                sk++;                       
                }
                if(a==b)
                        sk++;
        }
        //------------Конец определения корень какой степени нужно вычислить


        //------------Вычисление среднего геометрического
        result=1;
        gap_x=1;
        gap_y=XYZZ-2;
        for(i=0;i<XYZZ && gap_x<=gap_y;i++,gap_x++,gap_y--)
        {
                for(a=gap_x,b=gap_y;a<b;a++,b--)
                {
                        if(m[i][a]>0)
                        {
                                result*=pow(m[i][a],1.0/sk);
                        }
                        if(m[i][b]>0)
                        {
                                result*=pow(m[i][b],1.0/sk);
                        }
                }
                if(a==b)
                        result*=pow(m[i][a],1.0/sk);
        }
        //------------Конец вычисления среднего геометрического
        return(result);       
}


q23p 27-12-2008 21:13 991762

Mrcnn, спасибо!
Я, правда, на паре умудрился сделать, но все равно :)
Щас посмотрел код, приблизительно так и решал. Со средним геометрическим правда пришлось повозиться, долго не мог разобраться у какой из переменных тип другой поставить.
Еще раз спасибо за ответ :)


Время: 02:50.

Время: 02:50.
© OSzone.net 2001-