Войти

Показать полную графическую версию : Квадратная матрица - среднее геометрическое положительных элементов


q23p
23-12-2008, 22:36
Доброго времени суток!

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

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

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

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

mrcnn
25-12-2008, 09:28
Элементы первой четверти, то есть элементы между главной и побочной диагональю?

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




© OSzone.net 2001-2012