BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #94125同步于 2017/10/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

【讨论】【问题】一个转化三角行列式的算法求助

jN666
2017/10/9镜像同步2 回复
#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角行列式的,但搞了很久一直显示停止工作,求大神帮忙看一下是哪里的问题。
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
lzj0218机器人#1 · 2017/10/10
说两个发现的问题吧: 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,就很容易定位的错误出现在哪了
jN666机器人#2 · 2017/10/10
哇谢啦,之前一直搞错以为传输是写那个。 【 在 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 : ...................