[C]m*n矩阵划分成k*j等份
来源:互联网 发布:数据库性能测试 编辑:程序博客网 时间:2024/05/17 04:27
测试源码
#include "stdafx.h"#include <cstdlib>#include <cstdio>//定义结点用于存储最后的数据矩阵typedef struct sNode { int sum; int count; sNode *pNext; sNode():sum(0),count(0),pNext(NULL){}}sNode;//找到第m行n列所在的结点 resultN是最后结果集中的列数sNode* findNode(sNode*head, int m, int n,int resultN) { sNode* p = head->pNext; //先后移m-1行 for (int i = 0; i < m*resultN; i++) { p = p->pNext; } for (int i = 0; i < n; i++) { p = p->pNext; } return p;}//arr 矩阵数组 m为行数 n 为列数 splitM需拆分的行 splitN需拆分的列sNode* calculate(int * arr, int m, int n,int splitM,int splitN) { //如果想拆分的行列比现有的行列还大 则是不可拆分的 if (splitM > m || splitN > n) { return NULL; } sNode* head = new sNode; //初始化最后存储的数据 int resultM = m / splitM; int resultN = n / splitN; for (int i = 0; i < splitM*splitN; i++) { sNode * t = new sNode; t->pNext = head->pNext; head->pNext = t; } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { //确定结果属于第几行第几列 获取对应的数据存储结点 int findM = i / resultM < splitM ? i / resultM : splitM-1; int findN = j / resultN < splitN ? j / resultN : splitN-1; sNode* curNode = findNode(head , findM , findN, splitN); curNode->sum += *(arr + i*n + j); curNode->count++; } } return head;}//输出均值void PrintAvg(sNode*head,int splitN) { sNode*p = head->pNext; int i = 0; while (p) { printf("%d\t", p->sum/p->count); p = p->pNext; i++; if (i % 2 == 0) printf("\n"); } printf("\n");}//输出链表内容void Print(sNode*head, int splitN) { sNode*p = head->pNext; int i = 0; while (p) { printf("[%d,%d]\t", p->sum, p->count); p = p->pNext; i++; if (i % 2 == 0) printf("\n"); } printf("\n");}//输出原始数组void PrintArray(int *arr, int m, int n) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%d\t", *(arr + n*i + j)); } printf("\n"); } printf("\n");}//释放链表内存void Destroy(sNode* head) { while (head) { sNode* p = head; head = head->pNext; delete p; }}int main(){ //需将其拆分成splitM * splitN int splitM = 2; int splitN = 2; //下面的计算结果 对四行六列的进行 2*2划分 //[12,6] [30,6] //[12,6] [30,6] /*int m = 4; //矩阵行数 int n = 6; //矩阵列数 int arr[4][6] = { { 1,2,3,4,5,6 }, { 1,2,3,4,5,6 }, { 1,2,3,4,5,6 }, { 1,2,3,4,5,6 } };*/ //下面的计算结果 对五行六列的进行 2*2划分 //[12,6] [30,6] //[18,9] [45,9] /*int m = 5; //矩阵行数 int n = 6; //矩阵列数 int arr[5][6] = { { 1,2,3,4,5,6 }, { 1,2,3,4,5,6 }, { 1,2,3,4,5,6 }, { 1,2,3,4,5,6 }, { 1,2,3,4,5,6 } };*/ //下面的计算结果 对四行七列的进行 2*2划分 //[12,6] [44,8] //[12,6] [44,8] int m = 4; //矩阵行数 int n = 7; //矩阵列数 int arr[4][7] = { { 1,2,3,4,5,6,7 }, { 1,2,3,4,5,6,7 }, { 1,2,3,4,5,6,7 }, { 1,2,3,4,5,6,7 } }; printf("原始矩阵数组: \n"); PrintArray((int*)arr, m, n); sNode* result = calculate((int *)arr, m, n, splitM, splitN); if (!result) { printf("无法拆分...\n"); return 0; } printf("结果二元组[sum,count]:\n"); Print(result, splitN); //输出均值结果 printf("计算结果如下: \n"); PrintAvg(result, splitN); Destroy(result); system("pause"); return 0;}
测试结果
0 0
- [C]m*n矩阵划分成k*j等份
- 整数划分n划分成不大于k的放法数
- 将n划分成最大数不超过m的划分数
- 将正整数n划分成k个不同正整数的乘积,输出所有划分方法
- 整数N分成K份
- 关于电容的J K M R C
- n个平面最多将空间划分成几部分
- N分成m个数的和算法
- m个数分成n个数的和
- 把n个物品分成m堆
- reverse.c outData[i*N+j]=inData[j*M+i];
- 将整数n分成k份
- ACM2 递归 n分成k份
- M*N的矩阵
- M*N矩阵旋转
- K&R《C程序设计语言》p17:求m的n次方
- 求gcd(i,j,k)=m的方案数,i,j,k不同且属于1-n(组合数学+筛法(倍数法))
- c语言函数代码j=x;j=x+n-1;p=x+m,不懂
- 程序员必会的经典排序算法(三)插入排序
- 文章标题
- in操作符检查属性
- HDU 2090
- Android SQLite是线程安全的吗?
- [C]m*n矩阵划分成k*j等份
- Intent(二)隐式调用intent
- 08 JavaScript基础之--冒泡排序
- Java学习笔记--类与对象
- 【Hacker Rank】01.Say "Hello, World!" With Python
- Flask返回二进制图片
- 一些JAVA-Swing-JFream常用到的功能
- HDU 2089
- 从最大似然到EM算法浅解