Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 1405
Благодарности: 135

Профиль | Отправить PM | Цитировать


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

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);	
}

-------
Ehhh.. what's up, doc?..


Последний раз редактировалось mrcnn, 25-12-2008 в 09:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:28, 25-12-2008 | #2