三元组表中每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该

sb18002022-10-04 11:39:541条回答

已提交,审核后显示!提交回复

共1条回复
in_18top 共回答了22个问题 | 采纳率95.5%
行下标 ,列下标,元素值 这个必须对!
1年前

相关推荐

与三元组顺序表相比,系数矩阵用十字链表表示,其优点是
与三元组顺序表相比,系数矩阵用十字链表表示,其优点是
A.便于实现增加或减少矩阵中的非零元素的操作、
B.便于实现增加或减少矩阵元素的操作
C.可以节省存储空间
D.可以更快地查找到某个非零元素
标题错了,稀疏矩阵,一楼的,你这是矩阵相加啊
往事如风4011年前1
123258456 共回答了22个问题 | 采纳率100%
我有一个可以用的.怎么给你?百度hi我吧.
算了,我贴上来吧,由电脑编程网整理:
#include
#include
#define smax 45
typedef int datatype;
typedef struct lnode //结构体和共用体的定义
{
int i,j;
struct lnode *cptr,*rptr;
union
{
struct lnode *next;
datatype v;
}uval;
}link;
int flag=0;
//建立稀疏矩阵的函数,返回十字链表头指针
link *creatlinkmat()
{
link *p,*q,*head,*cp[smax];
int i,j,k,m,n,t,s;
datatype v;
printf("输入行、列,非零元素个数(m,n,t数字间用逗号分隔)");
scanf("%d,%d,%d",&m,&n,&t);//输入行、列,非零元素个数
if(m>n)s=m; else s=n;
head=(link *)malloc(sizeof(link)); //建立十字链表头结点
head->i=m;head->j=n;
cp[0]=head; //cp[]是指针数组,分别指向头结点和行、列表头结点
for(i=1;i<=s;i++) //建立头结点循环链表
{
p=(link *)malloc(sizeof(link));
p->i=0;p->j=0;
p->rptr=p;p->cptr=p;
cp[i]=p; cp[i-1]->uval.next=p;
}
cp[s]->uval.next=head;
for(k=1;k<=t;k++)
{
printf("t 第%d个元素(行号i 列号j 值v,数字间用空格分隔):",k);
scanf("%d%d%d",&i,&j,&v);
p=(link *)malloc(sizeof(link));
p->i=i;p->j=j;p->uval.v=v;
q=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->j q=q->rptr;
p->rptr=q->rptr;
q->rptr=p;
q=cp[j];
while((q->cptr!=cp[j])&&(q->cptr->i q=q->cptr;
p->cptr=q->cptr;
q->cptr=p;
}
return head;
}
//插入结点函数
void insert(int i,int j,int v,link *cp[])
{
link *p,*q;
p=(link *)malloc(sizeof(link));
p->i=i;p->j=j;p->uval.v=v;
//以下是经*p结点插入第i行链表中
q=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->j q=q->rptr;//在第i行中找第一个列号大于j的结点*(q->rptr)
//找不到时,*q是该行表上的尾结点
p->rptr=q->rptr;
q->rptr=p;//*p插入在*q之后
//以下是将结点插入第j列链表中
q=cp[j];//取第j列表头结点
while((q->cptr!=cp[j])&&(q->cptr->i q=q->cptr ;//在第j行中找第一个列号大于i的结点*(q->cptr)
//找不到时,*q是该行表上的尾结点
p->cptr=q->cptr;
q->cptr=p;//*p插入在*q之后
}
//输出十字链表的函数
void print(link *a)
{
link *p,*q,*r;//p是控制行q是控制列r是控制输出的格式
int k,col,t,row;
col=a->j;//矩阵a的列数
printf("矩阵为:n");
p=a->uval.next;//p指向第一个结点(不是头结点)
while(p!=a)
{
q=p->rptr;//p指向这以一行的一个值
if(q==a->cptr)break;//如果行或列处理完了,跳出
r=p;//r指向这一行的头结点
while(q!=p)
{
for(k=1;kj-(r->j);k++)//输出同一行上两非零数据间的零
printf(" 0");
printf("%3d",q->uval.v);//输出那个非零值
q=q->rptr;//q指向这一行的下一个元素
r=r->rptr;//r指向q前面的一个非零元素
}
k=r->j;//k的值是某一行的最后一个非零元的列数
for(t=k;t printf(" 0");
printf("n");
p=p->uval.next;//p指向下一行
}
}
link *add(link *a,link *b)
{
link *p,*q,*u,*v,*r,*cp[smax],*c;//p,q控制十字链a的行列,u,v控制十字链b的行列
int s,i;
if(a->i!=b->i||a->j!=b->j)

//建立c的表头环链
c=(link *)malloc(sizeof(link));
c->i=a->i;c->j=a->j;
if(c->i>c->j)s=c->i; else s=c->j;
cp[0]=c;
for(i=1;i<=s;i++)
{
r=(link *)malloc(sizeof(link));
r->i=0;r->j=0;
r->rptr=r;r->cptr=r;
cp[i]=r;
cp[i-1]->uval.next=r;
}
cp[s]->uval.next =c;
//矩阵相加
p=a->uval.next;u=b->uval.next;
while(p!=a&&u!=b)
{
q=p->rptr;v=u->rptr;
if(q==p&&v!=u)//矩阵a中第p行为空,矩阵b的第u行不为空
while(v!=u)//将b的行的都复制到和矩阵中

else if(v==u&&q!=p)//矩阵a中第p行不为空,矩阵b的第u行为空
while(q!=p)

else if(q!=p&&v!=u)//矩阵b的第u行和矩阵a的第p行都不为空
{
while(q!=p&&v!=u)
{
if(q->jj)//如果a中有元素的列数小于b的,将a中的所有小于b的值都插到c中

else if(q->j>v->j)//如果b中有元素的列数小于a的,将a中的所有小于b的值都插到c中

else//a、b当前是在同一个位置,判断加的和是否为零,不为零才做加法运算
{if(q->uval.v+v->uval.v!=0)insert(q->i,q->j,(q->uval.v+v->uval.v),cp);
q=q->rptr;v=v->rptr;
}
}
if(q==p&&v!=u)//如果b未处理完,将b中未处理的值都插入到和矩阵中
while(v!=u)

else if(v==u&&q!=p)//如果a未处理完,将a中未处理的值都插入到和矩阵中
while(q!=p)

else; //都处理完了,什么都不做
}
else ; //矩阵b的第u行和矩阵a的第p行都为空,什么都不做

p=p->uval.next;u=u->uval.next;//a、b都指向下一行
}
return c;
}
//
void main()
{
link *a,*b,*c;
a=creatlinkmat();print(a);
b=creatlinkmat();print(b);
c=add(a,b);
if(flag==1)printf("矩阵a、b不能相加!");
else printf("和矩阵c为:n");print(c);
}
测试用例:
输入行、列,非零元素个数(m,n,t数字间用逗号分隔)2,2,4
第1个元素(行号i 列号j 值v,数字间用空格分隔):1 1 1
第2个元素(行号i 列号j 值v,数字间用空格分隔):1 2 1
第3个元素(行号i 列号j 值v,数字间用空格分隔):2 1 1
第4个元素(行号i 列号j 值v,数字间用空格分隔):2 2 1
矩阵为:
1 1
1 1
输入行、列,非零元素个数(m,n,t数字间用逗号分隔)2,2,3
第1个元素(行号i 列号j 值v,数字间用空格分隔):1 1 5
第2个元素(行号i 列号j 值v,数字间用空格分隔):1 2 5
第3个元素(行号i 列号j 值v,数字间用空格分隔):2 1 5
矩阵为:
5 5
5 0
和矩阵c为:
矩阵为:
6 6
6 1
请按任意键继续. . .
三元组表示的矩阵的操作实现给定关系R(用矩阵表示),求R的自反闭包、对称闭包和可传递闭包.要求:(1)试试以序偶的形式输
三元组表示的矩阵的操作实现
给定关系R(用矩阵表示),求R的自反闭包、对称闭包和可传递闭包.
要求:
(1)试试以序偶的形式输入关系,转换为矩阵存储.如果不行就用矩阵直接输入.
(2)以关系和矩阵两种形式输出该关系的传递自反闭包、对称闭包和可传递闭包.
榕妃凤舞1年前1
专吃武松 共回答了17个问题 | 采纳率88.2%
我有一个可以用的.怎么给你?百度hi我吧.
算了,我贴上来吧,由电脑编程网整理:
#include
#include
#define smax 45
typedef int datatype;
typedef struct lnode //结构体和共用体的定义
{
int i,j;
struct lnode *cptr,*rptr;
union
{
struct lnode *next;
datatype v;
}uval;
}link;
int flag=0;
//建立稀疏矩阵的函数,返回十字链表头指针
link *creatlinkmat()
{
link *p,*q,*head,*cp[smax];
int i,j,k,m,n,t,s;
datatype v;
printf("输入行、列,非零元素个数(m,n,t数字间用逗号分隔)");
scanf("%d,%d,%d",&m,&n,&t);//输入行、列,非零元素个数
if(m>n)s=m; else s=n;
head=(link *)malloc(sizeof(link)); //建立十字链表头结点
head->i=m;head->j=n;
cp[0]=head; //cp[]是指针数组,分别指向头结点和行、列表头结点
for(i=1;i<=s;i++) //建立头结点循环链表
{
p=(link *)malloc(sizeof(link));
p->i=0;p->j=0;
p->rptr=p;p->cptr=p;
cp[i]=p; cp[i-1]->uval.next=p;
}
cp[s]->uval.next=head;
for(k=1;k<=t;k++)
{
printf("t 第%d个元素(行号i 列号j 值v,数字间用空格分隔):",k);
scanf("%d%d%d",&i,&j,&v);
p=(link *)malloc(sizeof(link));
p->i=i;p->j=j;p->uval.v=v;
q=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->j q=q->rptr;
p->rptr=q->rptr;
q->rptr=p;
q=cp[j];
while((q->cptr!=cp[j])&&(q->cptr->i q=q->cptr;
p->cptr=q->cptr;
q->cptr=p;
}
return head;
}
//插入结点函数
void insert(int i,int j,int v,link *cp[])
{
link *p,*q;
p=(link *)malloc(sizeof(link));
p->i=i;p->j=j;p->uval.v=v;
//以下是经*p结点插入第i行链表中
q=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->j q=q->rptr;//在第i行中找第一个列号大于j的结点*(q->rptr)
//找不到时,*q是该行表上的尾结点
p->rptr=q->rptr;
q->rptr=p;//*p插入在*q之后
//以下是将结点插入第j列链表中
q=cp[j];//取第j列表头结点
while((q->cptr!=cp[j])&&(q->cptr->i q=q->cptr ;//在第j行中找第一个列号大于i的结点*(q->cptr)
//找不到时,*q是该行表上的尾结点
p->cptr=q->cptr;
q->cptr=p;//*p插入在*q之后
}
//输出十字链表的函数
void print(link *a)
{
link *p,*q,*r;//p是控制行q是控制列r是控制输出的格式
int k,col,t,row;
col=a->j;//矩阵a的列数
printf("矩阵为:n");
p=a->uval.next;//p指向第一个结点(不是头结点)
while(p!=a)
{
q=p->rptr;//p指向这以一行的一个值
if(q==a->cptr)break;//如果行或列处理完了,跳出
r=p;//r指向这一行的头结点
while(q!=p)
{
for(k=1;kj-(r->j);k++)//输出同一行上两非零数据间的零
printf(" 0");
printf("%3d",q->uval.v);//输出那个非零值
q=q->rptr;//q指向这一行的下一个元素
r=r->rptr;//r指向q前面的一个非零元素
}
k=r->j;//k的值是某一行的最后一个非零元的列数
for(t=k;t printf(" 0");
printf("n");
p=p->uval.next;//p指向下一行
}
}
link *add(link *a,link *b)
{
link *p,*q,*u,*v,*r,*cp[smax],*c;//p,q控制十字链a的行列,u,v控制十字链b的行列
int s,i;
if(a->i!=b->i||a->j!=b->j)

//建立c的表头环链
c=(link *)malloc(sizeof(link));
c->i=a->i;c->j=a->j;
if(c->i>c->j)s=c->i; else s=c->j;
cp[0]=c;
for(i=1;i<=s;i++)
{
r=(link *)malloc(sizeof(link));
r->i=0;r->j=0;
r->rptr=r;r->cptr=r;
cp[i]=r;
cp[i-1]->uval.next=r;
}
cp[s]->uval.next =c;
//矩阵相加
p=a->uval.next;u=b->uval.next;
while(p!=a&&u!=b)
{
q=p->rptr;v=u->rptr;
if(q==p&&v!=u)//矩阵a中第p行为空,矩阵b的第u行不为空
while(v!=u)//将b的行的都复制到和矩阵中

else if(v==u&&q!=p)//矩阵a中第p行不为空,矩阵b的第u行为空
while(q!=p)

else if(q!=p&&v!=u)//矩阵b的第u行和矩阵a的第p行都不为空
{
while(q!=p&&v!=u)
{
if(q->jj)//如果a中有元素的列数小于b的,将a中的所有小于b的值都插到c中

else if(q->j>v->j)//如果b中有元素的列数小于a的,将a中的所有小于b的值都插到c中

else//a、b当前是在同一个位置,判断加的和是否为零,不为零才做加法运算
{if(q->uval.v+v->uval.v!=0)insert(q->i,q->j,(q->uval.v+v->uval.v),cp);
q=q->rptr;v=v->rptr;
}
}
if(q==p&&v!=u)//如果b未处理完,将b中未处理的值都插入到和矩阵中
while(v!=u)

else if(v==u&&q!=p)//如果a未处理完,将a中未处理的值都插入到和矩阵中
while(q!=p)

else; //都处理完了,什么都不做
}
else ; //矩阵b的第u行和矩阵a的第p行都为空,什么都不做

p=p->uval.next;u=u->uval.next;//a、b都指向下一行
}
return c;
}
//
void main()
{
link *a,*b,*c;
a=creatlinkmat();print(a);
b=creatlinkmat();print(b);
c=add(a,b);
if(flag==1)printf("矩阵a、b不能相加!");
else printf("和矩阵c为:n");print(c);
}
测试用例:
输入行、列,非零元素个数(m,n,t数字间用逗号分隔)2,2,4
第1个元素(行号i 列号j 值v,数字间用空格分隔):1 1 1
第2个元素(行号i 列号j 值v,数字间用空格分隔):1 2 1
第3个元素(行号i 列号j 值v,数字间用空格分隔):2 1 1
第4个元素(行号i 列号j 值v,数字间用空格分隔):2 2 1
矩阵为:
1 1
1 1
输入行、列,非零元素个数(m,n,t数字间用逗号分隔)2,2,3
第1个元素(行号i 列号j 值v,数字间用空格分隔):1 1 5
第2个元素(行号i 列号j 值v,数字间用空格分隔):1 2 5
第3个元素(行号i 列号j 值v,数字间用空格分隔):2 1 5
矩阵为:
5 5
5 0
和矩阵c为:
矩阵为:
6 6
6 1
请按任意键继续. . .
随机写出两个小于1的正数x,y,它们与1一起形成一个三元组(x,y,1),求这个三元组正好是钝角三角形的三个边的概率.
yangzh9451年前0
共回答了个问题 | 采纳率
《数据结构》论述题1.假设稀疏矩阵A采用三元组表示,编写一个函数计算其转置矩阵B,要求B也采用三元组表示 2.设二维数组
《数据结构》
论述题
1.假设稀疏矩阵A采用三元组表示,编写一个函数计算其转置矩阵B,要求B也采用三元组表示
2.设二维数组A5*6的每个元素占4个字节,已知Loc(a00)=1000,A共占多少个字节?A的终端结点a45的起始地址为多少?按行和按列优先存储时,a25的起始地址分别为多少?
3.编写下列算法(假定下面所用的串均采用顺序存储方式,参数ch、ch1和ch2均为字符型):
将串r中所有其值为ch1的字符换成ch2的字符.
将串r中所有字符按照相反的次序仍存放在r中.
从串r中删除其值等于ch的所有字符.
从串r1中第index个字符起求出首次与字符r2相同的子串的起始位置.
从串r中删除所有与串r3相同的子串(允许调用第(4)小题的函数和第(3)小题的删除子串的函数).
easygu1年前1
AA805 共回答了20个问题 | 采纳率85%
1、数据结构还没有学,但知道一点点思想.
三元组应该是用x,y来记录数在矩阵中的位置,z记录数的值.
转置矩阵就是把x、y交换下位置就可以了.
2、C语言中数组是行排列,一行一行的数就可以了.A占用字节数是5*6*4
按列存储的话就一列一列的数,好像有个公式,我给忘记了,自己推一下吧,挺简单的.
3、随便一本数据结构课本上都应该有类似代码,找一下吧,就不帮你写了,这么简单^_^.
写出下列稀疏矩阵的三元组表
koala_au1年前1
zd3231 共回答了6个问题 | 采纳率100%
看课本啊
用三元组表实现稀疏矩阵的转置运算
用三元组表实现稀疏矩阵的转置运算
二、实验内容
1、问题描述:定义一个5行3列的稀疏矩阵{{0,5,0},{6,0,0},{0,9,0},{0,3,7},{8,0,0}};
2、 基本要求 :
(1) 、采用三元组顺序表存储表示;
(2) 、显示上述稀疏矩阵的三元组表;
(3) 、对上述稀疏矩阵进行转置运算;
(4) 、显示稀疏矩阵转置 后的三元组表
ghying1年前1
栎鑫叔叔灏明伯伯 共回答了16个问题 | 采纳率87.5%
书上不是有吗?把我的给你看看,没关系,要下下礼拜才交
#include
using namespace std;
class matrix
{
public:
int data[100][100];
int m,n;
};
typedef int spmatrix[100][3];
void Init(matrix& mx);//稀疏矩阵初始化
void SpmDisplay(spmatrix spm);//显示三元组表示的矩阵
void Compressmatrix(matrix A,spmatrix B);//将稀疏矩阵转换为三元组矩阵
void Transpmatrix(spmatrix B,spmatrix& C);//将三元组矩阵转置
int main()
{
matrix mx;
spmatrix spm1,spm2;
//矩阵初始化
Init(mx);
//矩阵转为三元组
Compressmatrix(mx,spm1);
//显示三元组矩阵
SpmDisplay(spm1);
//将三元组转置存放到spm2中
Transpmatrix(spm1,spm2);
//显示转置后的三元组
SpmDisplay(spm2);
return 0;
}
void Init(matrix& mx)
{
cout<<"行数:";cin>>mx.m;cout< cout<<"列数:";cin>>mx.n;cout< cout<<"输入矩阵:"< for(int i=0;i!=mx.m;i++)
for(int j=0;j!=mx.n;j++)
cin>>mx.data[i][j];
}
void SpmDisplay(spmatrix spm)
{
for(int x=0;x<=spm[0][2];x++)
for(int y=0;y<=2;y++)
{
static int z=0;
if(0==z%3)
cout< z++;
cout< }
cout<}
void Compressmatrix(matrix A,spmatrix B)
{
int i,j,k=1;
for(i=0;i for(j=0;j if(A.data[i][j]!=0)
{
B[k][0]=i;
B[k][1]=j;
B[k][2]=A.data[i][j];
k++;
}
B[0][0]=A.m;
B[0][1]=A.n;
B[0][2]=k-1;
cout<<"Compress complete!"<}
void Transpmatrix(spmatrix B,spmatrix& C)
{
int i,j,t,m,n;
int x[100];
int y[100];
m=B[0][0];n=B[0][1];t=B[0][2];
C[0][0]=n;C[0][1]=m;C[0][2]=t;
if(t>0)
{
for(i=0;i for(i=1;i<=t;i++) x[B[i][1]]=x[B[i][1]]+1;
y[0]=1;
for(i=1;i for(i=1;i<=t;i++)
{
j=y[B[i][1]];
C[j][0]=B[i][1];
C[j][1]=B[i][0];
C[j][2]=B[i][2];
y[B[i][1]]=j+1;
}
}
cout<<"Transform complete!"<}
三元组方程X+Y=5 Y+Z=12 X+Z=13咋解?
sheepskin1年前6
chelu1104 共回答了23个问题 | 采纳率100%
X+Y=5 (1)
Y+Z=12 (2)
X+Z=13 (3)
(3)-(2)得 X-Y=1 (4)
(1)+(4)得 2X=6
X=3
Y=2
Z=10
稀疏矩阵三元组存储结构的定义及其有关算法的实现?
晚妆鲜1年前1
小溪流水XX 共回答了16个问题 | 采纳率81.3%
/*我写的一个例子,基本上将稀疏矩阵三元组存储结构的定义和其有关的算法都实现了,你可以借一本关于数据结构c语言实现的书来看一下*/
#include
#define MAXSIZE 1000//非零元素的个数最多为1000
typedef struct {
int row;
int col;
int e;
}Triple;
typedef struct{
Triple data[MAXSIZE];//非零元素的三元组表
int m;//矩阵的行数
int n;//矩阵的列数
int non_zero_num;//非零元数的个数
}XSMatrix;
XSMatrix XSM_Info_Input(XSMatrix s){
int i;
printf("输入矩阵的行数:");
scanf("%d",&s.m);
printf("输入矩阵的列数:");
scanf("%d",&s.n);
printf("输入矩阵的非零元素的个数:");
scanf("%d",&s.non_zero_num);
for(i=0;i
求所有三元组(x,y,z),满足x,y,z是正有理数,且x+1/y,y+1/z,z+1/x都是整数.
芳草小小1年前2
禅-无向 共回答了20个问题 | 采纳率95%
(1,1,1),(1/2,1,2),(2/3,2,1/3),(3,1/2,2/3)及其轮换
(2014•浦东新区一模)用|S|表示集合S中的元素的个数,设A、B、C为集合,称(A,B,C)为有序三元组.如果集合A
(2014•浦东新区一模)用|S|表示集合S中的元素的个数,设A、B、C为集合,称(A,B,C)为有序三元组.如果集合A、B、C满足|A∩B|=|B∩C|=|C∩A|=1,且A∩B∩C=∅,则称有序三元组(A,B,C)为最小相交.由集合{1,2,3,4}的子集构成的所有有序三元组中,最小相交的有序三元组的个数为______.
vnbfcf1年前1
lqxin-204 共回答了20个问题 | 采纳率90%
∵|A∩B|=|B∩C|=|C∩A|=1,
∴设A∩B={x},B∩C={y},C∩A={z},
∵A∩B∩C=∅,且x,y,z∈{1,2,3,4},
∴①集合{1,2,3,4}中的子集含有4个元素时,
∴从1,2,3,4四个元素选3个有
C34=4种方法,
将3个元素进行全排列有
A33=3×2=6种,剩余的一个元素可以分别放入集合A,B,C,有3种,
∴此时共有3×4×6=72种.
②集合{1,2,3,4}中的子集含有3个元素时,
满足集合A,B,C中都只有一个元素.
∴从1,2,3,4四个元素选3个有
C34=4种方法,
将3个元素进行全排列有
A33=3×2=6种,
∴此时共有4×6=24种.
综上共有72+24=96个.
故答案为:96.
若a,b,c都是小于10的正整数,a×b×c能被20整除,则满足条件的有序三元组(a,b,c)共有______个.
bkex1年前1
ferrari200 共回答了10个问题 | 采纳率90%
解题思路:a×b×c能被20整除,因此a×b×c的积是20的倍数,因为a,b,c都是小于10的正整数,因此有1×4×5=20,2×4×5=40,3×4×5=60,4×5×6=120,4×5×7=140,4×5×8=160,4×5×9=180;1×5×8=40,2×5×8=80,3×5×8=120,6×5×8=240,7×5×8=280,9×5×8=360;2×5×6=60;
由此可见:4×5可以与1,2,3,6,7,8,9组合,2×5可以与6,8组合(排除掉已经出现的,下同),6×5可以与8组合,8×5可以与1,3,7,9组合,一共有14组,每组有6种排列,所以有序三元组的数量是14×6=84.
但若再加上重复的话则有:(5,5,4),(5,5,8),(5,2,2),(5,4,4,),(5,6,6),(5,8,8)共6组,每组排列组合每组有有3种,则共要加6x3=18个.
所以,84+18=102个.

4×5可以与1,2,3,6,7,8,9组合,2×5可以与6,8组合(排除掉已经出现的,下同),6×5可以与8组合,8×5可以与1,3,7,9组合,一共有14组,每组有6种排列,所以有序三元组的数量是14×6=84.
但若再加上重复的话则有:(5,5,4),(5,5,8),(5,2,2),(5,4,4,),(5,6,6),(5,8,8)共6组,每组排列组合每组有有3种,则共要加6x3=18个.
所以,84+18=102个.
故答案为:102.

点评:
本题考点: 整数的裂项与拆分;找一个数的因数的方法.

考点点评: 根据a×b×c的积是20的倍数,确定a,b,c的值,进而求出其组合.

集合A.B.C的并集A并B并C={1,2,3,……9,10},求满足条件的集合的有序三元组(A,B,C)的个数
vicenlk1年前3
阿诗玛眼 共回答了20个问题 | 采纳率85%
1000
用三元组表实现稀疏矩阵的转置运算
用三元组表实现稀疏矩阵的转置运算
二、实验内容
1、问题描述:定义一个5行3列的稀疏矩阵{{0,5,0},{6,0,0},{0,9,0},{0,3,7},{8,0,0}};
2、 基本要求 :
(1) 、采用三元组顺序表存储表示;
(2) 、显示上述稀疏矩阵的三元组表;
(3) 、对上述稀疏矩阵进行转置运算;
(4) 、显示稀疏矩阵转置 后的三元组表;
feilong_lu1年前1
nikiblue 共回答了22个问题 | 采纳率95.5%
书上不是有吗?把我的给你看看,没关系,要下下礼拜才交
#include
using namespace std;
class matrix
{
public:
int data[100][100];
int m,n;
};
typedef int spmatrix[100][3];
void Init(matrix& mx);//稀疏矩阵初始化
void SpmDisplay(spmatrix spm);//显示三元组表示的矩阵
void Compressmatrix(matrix A,spmatrix B);//将稀疏矩阵转换为三元组矩阵
void Transpmatrix(spmatrix B,spmatrix& C);//将三元组矩阵转置
int main()
{
matrix mx;
spmatrix spm1,spm2;
//矩阵初始化
Init(mx);
//矩阵转为三元组
Compressmatrix(mx,spm1);
//显示三元组矩阵
SpmDisplay(spm1);
//将三元组转置存放到spm2中
Transpmatrix(spm1,spm2);
//显示转置后的三元组
SpmDisplay(spm2);
return 0;
}
void Init(matrix& mx)
{
cout<<"行数:";cin>>mx.m;cout< cout<<"列数:";cin>>mx.n;cout< cout<<"输入矩阵:"< for(int i=0;i!=mx.m;i++)
for(int j=0;j!=mx.n;j++)
cin>>mx.data[i][j];
}
void SpmDisplay(spmatrix spm)
{
for(int x=0;x<=spm[0][2];x++)
for(int y=0;y<=2;y++)
{
static int z=0;
if(0==z%3)
cout< z++;
cout< }
cout<}
void Compressmatrix(matrix A,spmatrix B)
{
int i,j,k=1;
for(i=0;i for(j=0;j if(A.data[i][j]!=0)
{
B[k][0]=i;
B[k][1]=j;
B[k][2]=A.data[i][j];
k++;
}
B[0][0]=A.m;
B[0][1]=A.n;
B[0][2]=k-1;
cout<<"Compress complete!"<}
void Transpmatrix(spmatrix B,spmatrix& C)
{
int i,j,t,m,n;
int x[100];
int y[100];
m=B[0][0];n=B[0][1];t=B[0][2];
C[0][0]=n;C[0][1]=m;C[0][2]=t;
if(t>0)
{
for(i=0;i for(i=1;i<=t;i++) x[B[i][1]]=x[B[i][1]]+1;
y[0]=1;
for(i=1;i for(i=1;i<=t;i++)
{
j=y[B[i][1]];
C[j][0]=B[i][1];
C[j][1]=B[i][0];
C[j][2]=B[i][2];
y[B[i][1]]=j+1;
}
}
cout<<"Transform complete!"<}
【求助】数据结构问题关于数组的压缩存储按照压缩存储的思想,对于 t 个非零元素的 m*n 阶稀疏矩阵,可以采用三元组表存
【求助】数据结构问题
关于数组的压缩存储
按照压缩存储的思想,对于 t 个非零元素的 m*n 阶稀疏矩阵,可以采用三元组表存储方法存储,但 t 满足()关系时,这样做才有意义。
A. tB. t<(m*n)/3
C. t<=(m*n)/3-1
D. t<(m*n)/3-1
答案是D,我认为是C,求高手解疑
melodysy741年前1
独孤的灯塔 共回答了28个问题 | 采纳率96.4%
很简单,因为t=(m*n)/3-1的时候,三元组法所占的空间,跟普通的存储方法占的空间一样大,并没有少,那也是没意义啊,多此一举,t要少于这个数,才有赚头。还有别忘了:为了方便得到稀疏距阵的总体信息,在使用三元组法时,总是多设一个结点,即对一个有N个非零元素的稀疏距阵要用N+1个结点来存储,多设的这个结点用于存放矩阵的总行数、总列数和非零元素的总个数。
对于下列稀疏矩阵,写出它的三元组表示法
oo乞丐王子1年前1
西部教师 共回答了20个问题 | 采纳率100%
((1,1,1),
(1,5,2),
(3,2,-3),
(4,2,-4),
(5,5,-1),
(5,6,15),
(6,4,7))
1.求证:全体整数的集合可以划分为有序三元组(a,b,c),使得每组的a^3 b+b^3 c+c^3 a的绝对值都是完全
1.求证:全体整数的集合可以划分为有序三元组(a,b,c),使得每组的a^3 b+b^3 c+c^3 a的绝对值都是完全平方数
2.已知关于x的方程lg(4x^2-(8a-1)x+5a^2)+x^2+(1-2a)x+2a^2=lg(x^2-2(a+1)x-a^2)恰有一个实数根,求实参数a的所有可能值
3.已知正整数数列{An}满足A0=m,A n+1=An ^5+487.试求m的值,使得{An}中完全平方数的个数最大
4.求所有正整数组(a,b,p,n),使得p为素数,且a^3+b^3=p^n
5.确定是否存在一个正整数n,n无平方因子,恰好被2011个不同的质数整除,而且2^n+1被n整除
6.
selinabmw7451年前2
jackieyin 共回答了17个问题 | 采纳率76.5%
3.显然m≡0,1,2,3(mod4),下面依次讨论.
若m≡0(mod4),那么A[1]≡m^5+487≡487≡3(mod4),A[2]≡A[1]^5+487≡(-1)^5+487≡2(mod4),A[3]≡A[2]^5+487≡3(mod4),这样易得A[4]≡2(mod4),A[5]≡3(mod4),……,这样依次循环.而完全平方数对4取模应余0或1,这样A[n]中至多只有一个完全平方数(A[0]).
若m≡1(mod4),那么易知A[1]≡0(mod4),A[2]≡3(mod4),A[3]≡2(mod4),A[4]≡3(mod4),……,此时至多有2个完全平方数(A[0]和A[1]).
同样的分析,若m≡2或3(mod4),那么A[n]中不可能有完全平方数.
由上知A[n]中至多有2个完全平方数,且只可能为A[0]和A[1],下面求m的值使A[0]和A[1]都为完全平方数.
设A[0]=m=k²,那么设A[1]=m^5+487=k^10+487=n²,∴487=n²-k^10=(n-k^5)(n+k^5).注意到487是质数,那么n-k^5=1,n+k^5=487,解得k=3,∴m=9.经检验,m=9时A[0]和A[1]均为完全平方数,∴所求m即为9.
稀疏矩阵如何生成相应的三元组顺序表?
bluemekey1年前1
wehawk 共回答了16个问题 | 采纳率93.8%
稀疏矩阵转制问题
生成一个三元组:
包括三个类别的书(横坐标、纵坐标、然后是值)
首先声明一个结构体,包括三组数据,如上三类.
struct{int x;//横坐标
int y;//纵坐标
int dt;//数据}然后是遍历稀疏矩阵
可以采用如下方法
int d,b;//声明两个变量d和b
for(d=0;dfor(b=0;b

1年前

3
抽象数据类型三元组的定义为什么数据关系是呢?
抽象数据类型三元组的定义为什么数据关系是呢?
inittriplet,destroytriplet,get,put,isascending,isdescending,max,min这些基本操作都分别用了哪些关系?
amelieyao1年前1
宝宝的乖乖仔 共回答了20个问题 | 采纳率90%
操作结果:构造了三元组T,元素 e1,e2和e3分别被赋予V1,V2,和V3的值 不要灰心,你说的这个是抽象数据类型定义,如果没学过数据结构看起来的确