回首往昔,自己学C语言已经有一段时间了,在学习的过程中也遇到了很多的问题,也通过看其他大佬的博客得到解决。到今天,自己学有余力,准备记录一下自己的学习心得,帮助大家更好的理解题目。 近期的先从基础的开始写,到后面会慢慢的更新一些数据结构算法还有一些题,比如pat甲级乙级这些。
2021年11月10日
-
将给定N*N矩阵右上角乘上某个数
以对角线为分割线 即i=j的时候就是对角线上的点。
#include int main() { int a[3][3]={ 1,2,3, 4,5,6, 7,8,9 }; int i,j,m=3;//假设要乘的数为3,具体看题目来 for(i = 0;i < 3;i++) // 右上角*m for(j = i; j < 3; j++) a[i][j]*=m; // for(i = 0; i < 3;i++) // 左下角*m // for(j = 0;j <= i;j++) // a[i][j]*=m; for(i = 0;i < 3;i++) { for(j = 0;j < 3;j++) printf("%d ",a[i][j]); puts(""); } return 0; }
-
N*N矩阵的变换 行变列
1 2 3 1 4 7
4 5 6 ->2 5 8
7 8 9 3 6 9
观察发现
1.可以按照对角线对称交换(条件N*N)
2.也可以新开一个数组把第一行存到一列第二行存到第二列这样子依次存下去.
3.变一下输出顺序,交换两个for循环。(推荐)
下面举一下列子(按对角线对称)。
#includeint main() { int a[4][4]={ 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16 }; int i,j; for(i = 0;i < 4 ;i++) for(j = 0;j < i;j++) { int t = a[i][j]; a[i][j] = a[j][i]; a[j][i] = t; } // for(i = 0;i < 3 ;i++) 错误写法 这样就相当于交换了两遍,矩阵没有变化 // for(j = 0;j < 3;j++) // { // // int t = a[i][j]; // a[i][j] = a[j][i]; // a[j][i] = t; // // } for(i = 0;i < 4;i++) { for(j = 0;j < 4;j++) printf("%d ",a[i][j]); puts(""); } return 0; }
下面给一道列题(交换两个for循环顺序)
矩阵转置
#include#include using namespace std; int a[101][101]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i = 0;i < n ; i++) for(int j =0;j < m ;j++) scanf("%d",&a[i][j]); //当j = 0 , 第一行也就是a[0][0] a[1][0] a[2][0]....a[n-1][0] // 这样相当先遍历第一列 然后第二列.... 就相当于转置了 for(int j = 0;j < m; j++) { for(int i = 0 ;i < n; i++) printf("%d ",a[i][j]); printf("n"); } return 0; }
3.求一个序列最大值 和 最小值
给出一到例题
最大值和最小值的差
#include int a[10010]; int Max_(int a[],int L) { int x = a[0]; // 假设第一个数最大 for(int i = 1;i < L; i++) if(a[i] > x) x = a[i]; // 如果有比x数大的,那就把值给x return x; } int Min_(int a[],int L) { int x = a[0]; for(int i = 1;i < L; i++) if(a[i] < x) x = a[i]; return x; } int main() { int n; scanf("%d",&n); for(int i = 0 ;i < n; i++) scanf("%d",&a[i]); printf("%d",Max_(a,n)-Min_(a,n)); return 0; }
如有错误,请大佬们斧正!!!



