带状矩阵,对称矩阵,三角矩阵

对称矩阵:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值