1. 程式人生 > >帶狀矩陣,對稱矩陣,三角矩陣

帶狀矩陣,對稱矩陣,三角矩陣

對稱矩陣:

#include <stdio.h>    //重要公式*(p+((k*(k+1)/2)+p1)*sizeof(int))= *(p+((p1*(p1+1)/2)+k)*sizeof(int))
#include <stdlib.h>
int main()
{
    int n,len,k,m,p1,i;
    scanf("%d",&n);
    printf("請輸入詢問次數:\n");
    scanf("%d",&m);
    len=n*(n+1)/2;  //計算需要輸入的個數
    int *p=(int *)malloc(sizeof(int)*len); //分配空間
    int *f;
    f=p;
    printf("請輸入%d個數:\n",len);
    for(; f<=p+(n*(n+1)/2-1)*sizeof(int); f+=sizeof(int))
    {
        scanf("%d",f);  //讀入該空間所分配的元素
    }
    printf("請輸入要詢問的數:\n");
    //printf("%d\n",*p);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&k,&p1);  //讀入要查詢的數的行,列數
        if(k>=p1)  //在對角線上或對角線以下
        {
            printf("%d\n",*(p+((k*(k+1)/2)+p1)*sizeof(int)));
        }
        else  // 在對角線以上可以通過對角線以下查詢 因為aij=aji
            printf("%d\n",*(p+((p1*(p1+1)/2)+k)*sizeof(int)));
    }
    return 0;
}

三角矩陣:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n,len,k,m,p1,i;
    scanf("%d",&n);
    printf("請輸入詢問次數:\n");
    scanf("%d",&m);
    len=n*(n+1)/2;  //計算出三角矩陣所需輸入元素個數
    int *p=(int *)malloc(sizeof(int)*len);  //申請動態記憶體
    int *f;
    f=p;
    printf("請輸入%d個數:\n",len);
    for(; f<=p+(n*(n+1)/2-1)*sizeof(int); f+=sizeof(int))//讀入資料
    {
        scanf("%d",f);
    }
    printf("請輸入要詢問的數:\n");
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&k,&p1);  //讀入要查詢的數在第幾排,第幾列
        if(k<=p1)    //上三角矩陣只有當k<=p1時有非0值
        {
            printf("%d\n",*(p+((n-k+1)*k+k*(k-1)/2+p1-k)*sizeof(int)));//根據地址查詢
        }
        else     //k>p1一定只有0值
            printf("0\n");
    }
    return 0;
}

帶狀矩陣:

#include <stdio.h>   //查詢元素的值的公式為*(p+((2*b+1)*k-b+p1-k+b)*sizeof(int))
#include <math.h>   //p為首地址,k為行數,p1為列數,b為帶狀矩陣半寬
#include <stdlib.h>
int main()
{
    int n,len,k,m,p1,i,b;
    scanf("%d %d",&n,&b);
    printf("請輸入詢問次數:\n");
    scanf("%d",&m);
    len=(2*b+1)*n-2*b;  //帶狀矩陣元素的計算公式
    int *p=(int *)malloc(sizeof(int)*len);
    int *f;
    f=p;
    printf("請輸入%d個數:\n",len);
    for(; f<=p+(len-1)*sizeof(int); f+=sizeof(int))
    {
        scanf("%d",f);  //讀入元素
    }
    printf("請輸入要詢問的數:\n");
    //printf("%d\n",*p);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&k,&p1);  // 詢問的數在第幾行,第幾列
        if(abs(k-p1)>=0)   //當abs(k-p1)>=0時才有不為零的元素
        {
            printf("%d\n",*(p+((2*b+1)*k-b+p1-k+b)*sizeof(int)));//根據地址查詢
        }
        else
            printf("0\n");
    }
    return 0;
}