c语言的练习—二维数组的练习(对称矩阵的判定)
对于此道题所谓对称矩阵意思就是关于左对角线对称的数字对应相等。那么我们不妨使用我上一次发表的文章的方法来进行规律的寻找。我们不妨使用题目中的第一个例子来举例接下来我以图片的方式呈现出来显然的我们能够发现这两个三的位置和两个十二的位置是不是恰巧 i 与 j 的数字交换位置了。那么聪明的你是不是觉得找到真正的规律了。认为只需要 判断 sz[i][j]sz[j][i]就可以了这个先留在这里作为一个疑惑。我们不妨验证一下。我改变了一下我的代码以完成这步的探究、这里给出错误的代码图片后面我讲解正确算法时我再逐步分解编写代码的过程这里是其输出确实的这个矩阵很明显是一个对称矩阵但是我们不需要如此之多的yes我们只需要一个yes,就可以了。但是如何解决这个问题呢其实是非常简单的在学习c语言的时候我们曾经学过如何判断一个数是素数这个的做法与其很相似我们当时定义了一个变量这里不妨设为a,给a赋值为1。a1如果这个数n与2到n-1的数取余不等于零我们说这个a1,否则a0注意在这里设置a为全局变量否则我们后续将无法使用这个a。于是我们使用这个a来做判断如果a1那么这个数是素数如果a0那么就不是这样就解决了多个yes的问题了。注意 判断时 if(a1),里面是两个等于号才代表判断否则代表赋值。那么这道题我们使用同样的思想这里我不妨给出完整的代码。#includestdio.hint main(){int n;int sz[25][25];//在定义数组时多定义几个位置为了防止数组越界并且有助于算法的实现。int statistic0; //统计数字我用的变量就是这个英文单词的意思是不是很明确呢。while(scanf(%d,n)!EOF){//这里实现多组输入if(n0) break;//满足题目要求else {for(int i0;in;i){for(int j0;jn;j){scanf(%d,sz[i][j]);}}statistic0;//在多组输入的过程中要更新这个数字的值否则会产生错误。for(int i0;in;i){for(int j0;jn;j){if(sz[i][j]sz[j][i]){statistic;}}}if(statisticn*n){printf(yes\n);} else{printf(no\n);}}}return 0;}接下来是核心代码的解读if(statisticn*n){printf(yes\n);} else{printf(no\n);}我这里为什么要判断是n*n其实就是n平方的意思我们想如果这个矩阵是一个对称矩阵那么对称位置上的数字都是相等的。除去这些对称位置上的数字就剩下了正对角线的数字这些数字的 i , j 都是相同的也就是判断它们是不是等于它们本身显然是的。所以也就是 statistic这个变量等于这个矩阵中一共有多少个数字那么这个矩阵就一定是一个对称矩阵否则就不是一个对称矩阵。对于我的算法而言我作为一个初学者目前只能够做到On*n) ,我相信一定会有更优质的算法能够降低时间复杂度。但是我尚未学习。仅能够做到现在的程度。我想当我学到的时候我可能会联想到这一题吧到时候再给出更优解。说到这里这道题的讲解就结束了感谢您的阅读如果您觉得小白作者的思路还可以的话不妨给我留下一个免费的点赞支持一下萌新作者我吧。谢谢啦
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2568122.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!