2017-06-02 60 views
-1

我必须制作一个程序,它可以找到与主对角线平行的矩阵元素的总和。我不知道如何找到与主对角线平行的元素。 i == j仅适用于主对角线。假设我们有这样一个矩阵:在矩阵中找到主要对角线的元素

22 5 6 4 
32 45 7 9 
1 21 43 6 
7 5 9 11 

我必须单独找到总和:4; 6 + 9; 5 + 7 + 6; 22 + 45 + 43 + 11; 32 + 21 + 9; 1 + 5; 7

After the changes the code become like this: 
#include <stdio.h> 
#include <cmath> 
#include <cstdlib> 
#define N 50 
void enter_matrix (float m[N][N],int n){ 
    int i,j; 
    for(i=0;i<n;i++){ 
     for(j=0;j<n;j++){ 
      printf("Enter %d %d element of the matrix: ",i+1,j+1); 
      scanf("%f",&m[i][j]); 
     } 
    } 
} 
void show_matrix(float m[N][N],int n){ 
    int i,j; 
    for(i=0;i<n;i++){ 
     for(j=0;j<n;j++){ 
      printf("%.2f\t",m[i][j]); 
     } 
     printf("\n"); 
    } 
} 

int find_sums(float m[N][N],float sum[100],int n){ 
    int j=0; 
    for(int offset = -n+1; offset < n; ++offset) { 
    float sum1 = 0; 
    for(int i = 0; i < n-fabs(offset); ++i) { 
     if(offset <= 0) { 
      sum1 += m[i][i-offset]; 
     } 
     else { 
      sum1 += m[i+offset][i]; 
     } 
     sum[j]=sum1;j++;printf("%.2f \n",sum1); 
    } 
    } 
    return j; 
} 

int find_max(float sum, int j){ 
    int i,maxn;float *s,max=0;s=&sum; 
    for(i=0;i<j;i++){ 
     if(*(s+1)>max){ 
      max=*(s+1); 
      maxn=i; 
     } 
    } 
    return maxn; 
} 

int find_min(float sum, int j){ 
    int i,minn; 
    float *s; 
    s=&sum;float min=*(s+0); 
    for(i=0;i<j;i++){ 
     if(*(s+1)<min){ 
      min=*(s+1); 
      minn=i; 
     } 
    } 
    return minn; 
} 

void main(){ 
    float matrix [N][N], sum[100],*s; 
    int n,j,maxn,minn; 
    s=sum; 

    do{ 
     printf("Enter matrix dimension (between 1 and 50):"); 
     scanf("%d",&n); 
    } 
    while(n<=0||n>50); 
    enter_matrix(matrix,n); 
    show_matrix(matrix,n); 
    j=find_sums(matrix,sum,n); 
    maxn=find_max(sum[100],j); 
    minn=find_min(sum[100],j); 
    printf("Maximum sum is equal to %.2f, at line %d\n",sum[maxn],maxn+1); 
    printf("Minimum sum is equal to %.2f, at line %d\n",sum[minn],minn+1); 
} 

和输出是这样的:

Enter matrix dimension (between 1 and 50):3 
Enter 1 1 element of the matrix: 1 
Enter 1 2 element of the matrix: 2 
Enter 1 3 element of the matrix: 3 
Enter 2 1 element of the matrix: 4 
Enter 2 2 element of the matrix: 5 
Enter 2 3 element of the matrix: 6 
Enter 3 1 element of the matrix: 7 
Enter 3 2 element of the matrix: 8 
Enter 3 3 element of the matrix: 9 
1.00 2.00 3.00 
4.00 5.00 6.00 
7.00 8.00 9.00 
3.00 
2.00 
8.00 
1.00 
6.00 
15.00 
4.00 
12.00 
7.00 
Maximum sum is equal to 3.00, at line 1 
Minimum sum is equal to 3.00, at line 1 
Press any key to continue 

它正在采取一些额外的资金,不仅全部线路。有什么建议么?

+0

你是[close](https://ideone.com/5HhRQQ),但是除此之外,'sum [j] = ...'应该在内部循环之外。请问为什么你将C程序(https://ideone.com/06058d)标记为C++? –

回答

0

未测试从我的头顶:

int n; 
double A[n][n] 

for(int offset = -n+1; offset < n; ++offset) { 
    double sum = 0; 
    for(int i = 0; i < n-std::abs(offset); ++i) { 
     if(offset <= 0) { 
      sum += A[i][i-offset]; 
     else { 
      sum += A[i+offset][i]; 
     } 
    } 
    std::cout << sum << std::endl; 
} 

对于负偏移此打印上平行对角线的总和和正偏移下部平行对角线的总和。第一个循环可以并行化,print语句是唯一的关键部分。

+0

谢谢,但我需要分开的每一行的总和,所以我可以将它们存储在一个单独的数组中。例如总和[1]中的6 + 9和总和[5]中的总和5 + 7 + 6等等 – user3058396

+0

@ user3058396什么可以防止您添加数组(例如'double d [2n-1];' ),一个变量('int j = 0'?)和内部循环结束后的两个语句('a [j] = sum; ++ j;')? ;) –

+0

它没有出现在我的脑海里,谢谢我会尝试 – user3058396

0

对于那些对角线,它认为j = i + z对于z取决于对角线,从 - (height-1)到(width-1)。

这将导致以下算法(解阵能够处理负指数 - 你必须改变,通过一些偏移量):

Array<R> diagonalSums (Matrix<R> m) 

    initialize Array<R> solution in according size with all entries initialized to zero 

    for each cell i,j in m: 
     find z so that j = i + z (z = j - i) 
     solution[z] += m(i,j) 

    return solution 

我认为你这样做,以你的偏移,但你试图找到一种方法,从z到属于该z的总和,这只是不必要的混淆,至少当你想要计算所有的总和时(如果只需要一个总和,你的方式会更好)。我的方法只是遍历所有单元格,然后将其添加到相应的位置。

我用了一个负数索引的数组,为了增加可读性,我建议你也这样做,那就是创建一个可以做到这一点的类。

相关问题