蛇行矩阵两种编程方法及详解(c++)

1 篇文章 0 订阅
1 篇文章 0 订阅

题目描述

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

输入格式

本题有多组数据,每组数据由一个正整数N组成。(N不大于100)

输出格式

对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。

样例输入

5

样例输出

1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

 具体代码及详细分析

方法一:

此方法为本人初写该题目的方案,较为繁琐,但容易想到

要解此题,首先观察题目给的样例输出,找出其中的三层关系。
①每一行中,相邻数的增加关系是依次加1的,如第一行:1->3增加关系是2,3->6增加关系是3,6->10增加关系是4。(所以我们联想到要有一个变量k1且k1++)
②每行的第一个数由上到下,增加关系依次加1,如1->2增加关系是1,2->4增加关系是2,4->7增加关系是3。(所以我们联想到要有一个变量k2且k2++)
③每行的第一个相邻数之间的增加关系之间还存在一个恒为1的增加关系,如第一行1->3增加关系是2,第二行2->5增加关系是3,第三行4->8增加关系是4,那么2->3增加关系是1,3->4增加关系是1,这个增加关系一直都是1,没有变化。(所以我们联想到要有一个常量k3且k3=1)
④每行的数字个数有一个与N有关的减小关系,N是多少,第一行就是多少个数,接下来的每一行数字个数依次减1。

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n, m; cin >> n;
	m = n;
	int num[100][100];
	num[0][0] = 1;
	for (int i = 0; i < n; i++) {
		int a = i + 2;                         //代表每一行前两元素的差
		int b = i + 1;                         //代表第一列前两元素的差
		for (int j = 0; j < m; j++) {
			num[i][j + 1] = num[i][j] + (a++);
		}
		num[i + 1][0] = num[i][0] + (b++);
		m--;
	    }
	m = n;                                    //仍需要初始化m,否则程序会出现错误
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < m - 1; j++) {
			cout << num[i][j] << " ";
		}
		cout << num[i][m - 1] << endl;        //补充每一行最后一数组元素
		m--;                                  
	    }
	cout << num[n - 1][0];
	return 0;
           }

方法二:

找到各个数组之间的关系,即蛇形数组的规律,满足按对角线依次增加的规律

#include <bits/stdc++.h>
using namespace std;
int main() {
	int x, count = 1, mat[100][100];   //count为计数器
	for (int j = 0; j < 100; j++)      //据上图规律遍历所有斜对角数并赋初值
		for (int k = 0; k <= j; k++)
			mat[j - k][k] = count++;
	cin >> x;
	for (int j = 0; j < x; j++) {      //注意j、k、x之间的关系
		for (int k = 0; k + j < x; k++) cout << mat[j][k] << ' ';
		cout << endl;                  //补充每一行最后一个数组元素的的换行
		} 
	return 0;
}

上述内容皆为本人观点,如有错误欢迎指正 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MPI矩阵乘法的两种实现方法分别为普通的矩阵乘法和Cannon算法。下面分别介绍这两种方法的实现步骤。 1. 普通的矩阵乘法 普通的矩阵乘法算法是最基本的矩阵乘法算法,也是最容易理解和实现的算法。其实现步骤如下: - 从文件中读入两个矩阵A和B,将其分配给各个进程。 - 对于进程i,将A的第i行分配给该进程,B的第i列分配给该进程。 - 每个进程计算该进程所分配到的A和B的部分矩阵的乘积。最终得到C的一部分。 - 将各个进程计算得到的部分C矩阵合并,得到最终的C矩阵。 2. Cannon算法 Cannon算法是一种分治算法,它可以将矩阵乘法的计算任务分配给多个进程,使得计算速度更快。其实现步骤如下: - 从文件中读入两个矩阵A和B,将其分配给各个进程。 - 对于进程i和j,将A的第i行分配给进程(i+j) mod p,将B的第j列分配给进程(i+j) mod p。 - 每个进程计算该进程所分配到的A和B的部分矩阵的乘积。最终得到C的一部分。 - 依次进行p-1轮的通信和计算,每轮将A向左移动一列,B向上移动一行,然后计算所得的矩阵乘积的部分矩阵,再将所得的部分矩阵累加到最终的C矩阵上。 总体来说,普通的矩阵乘法比较容易理解和实现,但是当矩阵规模较大时,其计算速度会变慢。而Cannon算法虽然相对复杂一些,但是可以将计算任务分配给多个进程,从而提高计算效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值