返回信息流#include <stdio.h>
int main()
{
void r(int r1,int r2,int a[][4],int n);
void move(int r1,int r2,int a[][4]);
int s;
int order(int c,int a[][4]);
int a[4][4],i=0,m=0;
printf("按行依次输入,由第一行开始");
for(;i<=15;i++)
{
scanf("%d",((&a[0][0])+i));
if((i+1)%4==0)printf("%d行输入完毕",(i+1)/4);
}
for(i=0;i<=2;i++)
{
m=order(i+1,a[4][4]);
for(;m<=3-i;)
{
r(m,m+1,a[4][4],i+1);
m++;
}
}
s=a[0][3]*a[1][2]*a[2][1]*a[3][0];
printf("%d",s);
return 0;
}
void r(int r1,int r2,int a[][4],int n)
{
int i=0;
int p,q;
p=a[r1-1][n-1];
q=a[r2-1][n-1];
for(;i<=3;i++)
{
a[r2-1][i]=p*a[r2-1][i];
a[r1-1][i]=a[r1-1][i]*q-a[r2-1][i];
}
}
void move(int r1,int r2,int a[][4])
{
int i=0,n;
for(;i<=3;i++)
{
n=a[r1-1][i];
a[r1-1][i]=a[r2-1][i];
a[r2-1][i]=n;
}
}
int order(int c,int a[][4])
{
int i=1,n=0,b=0;
if(a[0][c-1]==0)b=1;
for(;i<=4-c;i++)
{
if(a[i][c-1]==0)move(i+1,++n,a);
}
if(b==1)n++;
return (n+1);
}
这个是模拟逐列消0的过程把四阶行列式转换成3角行列式的,但搞了很久一直显示停止工作,求大神帮忙看一下是哪里的问题。
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #94125同步于 2017/10/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
【讨论】【问题】一个转化三角行列式的算法求助
jN666
2017/10/9镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
说两个发现的问题吧:
1. 你定义的数组是int a[4][4],那么合法的下标应该是0~3,代码的第18行和第21行都使用了a[4][4]这个元素,这是不正确的(只会产生不确定的结果,不一定会造成运行错误)
2. 你定义的move()函数和order()函数中,参数a的类型是int (*)[4],而你在第18行和第21行调用这两个函数时传入的参数都是int,这会使你的程序访问非法的内存空间,造成segmentation fault
建议楼主学习一下IDE中自带的调试工具,或者Linux下的gdb,就很容易定位的错误出现在哪了
哇谢啦,之前一直搞错以为传输是写那个。
【 在 lzj0218 (Snail) 的大作中提到: 】
: 说两个发现的问题吧:
: 1. 你定义的数组是int a[4][4],那么合法的下标应该是0~3,代码的第18行和第21行都使用了a[4][4]这个元素,这是不正确的(只会产生不确定的结果,不一定会造成运行错误)
: 2. 你定义的move()函数和order()函数中,参数a的类型是int (*)[4],而你在第18行和第21行调用这两个函数时传入的参数都是int,这会使你的程序访问非法的内存空间,造成segmentation fault
: ...................