第9週目、項目2(3)—対称行列の圧縮記憶の実現と運用
3436 ワード
問題およびコード:
実行結果:
学習の心得:
前の2つのアルゴリズムをうまく運用する.
/*
9 、 2(1)—
*Copyright(c) 2015,
*All rights reserved.
* :test.cpp
* :
* :2015 10 30
* ;v1.0
*
* : : 、 、 , .
* :
* :
*/
#include <stdio.h>
#include <malloc.h>
#define N 4
#define M 10
void Init(int *&b)
{
b = (int*)malloc(sizeof(int)*(N*(N+1)/2));
}
// b[M] , A[i][j]
int Value(int b[], int i, int j)
{
if (i>=j)
return b[(i*(i+1))/2+j];
else
return b[(j*(j+1))/2+i];
}
// e A[i][j], B[M]
void Assign(int b[], int e, int i, int j)
{
if (i>=j)
b[(i*(i+1))/2+j] = e;
else
b[(j*(j+1))/2+i] = e;
return;
}
// b
void Disp(int b[])
{
int i,j;
for (i=0; i<N; i++)
{
for (j=0; j<N; j++)
printf("%4d",Value(b,i,j));
printf("
");
}
}
//
void Destroy(int b[])
{
free(b);
}
int value(int a[],int i,int j)
{
if (i>=j)
return a[(i*(i+1))/2+j];
else
return a[(j*(j+1))/2+i];
}
void madd(int a[],int b[],int c[][N])
{
int i,j;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
c[i][j]=value(a,i,j)+value(b,i,j);
}
void mult(int a[],int b[],int c[][N])
{
int i,j,k,s;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
{
s=0;
for (k=0; k<N; k++)
s=s+value(a,i,k)*value(b,k,j);
c[i][j]=s;
}
}
void disp1(int a[])
{
int i,j;
for (i=0; i<N; i++)
{
for (j=0; j<N; j++)
printf("%4d",value(a,i,j));
printf("
");
}
}
void disp2(int c[][N])
{
int i,j;
for (i=0; i<N; i++)
{
for (j=0; j<N; j++)
printf("%4d",c[i][j]);
printf("
");
}
}
int main()
{
int *b1; // ,
int i, j;
int v;
Init(b1);
printf(" ( )
");
for(i=0;i<N;i++)
{
printf(" %d %d : ", i+1, i+1);
for(j=0; j<=i; j++)
{
scanf("%d", &v);
Assign(b1, v, i, j);
}
}
Disp(b1);
Destroy(b1);
int a[M]= {1,2,3,4,5,6,7,8,9,10}; //a
int b[M]= {1,1,1,1,1,1,1,1,1,1};
int c1[N][N],c2[N][N];
madd(a,b,c1);
mult(a,b,c2);
printf("a :
");
disp1(a);
printf("b :
");
disp1(b);
printf("a+b:
");
disp2(c1);
printf("a×b:
");
disp2(c2);
printf("
");
return 0;
}
実行結果:
学習の心得:
前の2つのアルゴリズムをうまく運用する.