第9週目、項目2(3)—対称行列の圧縮記憶の実現と運用

3436 ワード

問題およびコード:
/*
 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つのアルゴリズムをうまく運用する.