CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

请教将一个3X3的矩阵转置的算法

楼主xyjchinese(春天把老婆种到地下后我就急切的盼望秋天的到来)2006-05-02 01:00:37 在 C/C++ / C语言 提问

我写的这个我自己就觉得不对,还请指教一下。  
  #include<stdio.h>  
  #define   N   3  
  int   main()  
  {  
          int   arr[N][N]={1,2,3,4,5,6,7,8,9},i,j;  
          /*  
          for(i=0;i<N;i++)  
            for(j=0;j<N;j++)  
                scanf("%d",&arr[i][j]);  
          */  
          for(i=0;i<N;i++){  
            for(j=0;j<N;j++)  
                printf("%d\t",arr[i][j]);  
            printf("\n");  
            }  
          printf("\n\n");  
          int   t;  
          for(i=0;i<N;i++)  
            for(j=0;j<N;j++){  
                t=arr[i][j];  
                arr[i][j]=arr[i%(N-1)][j%(N-1)];  
                arr[i%(N-1)][j%(N-1)]=t;  
                }  
          for(i=0;i<N;i++){  
            for(j=0;j<N;j++)  
                printf("%d\t",arr[i][j]);  
            printf("\n");  
            }  
             
          system("pause");  
          return   0;  
  }  
   
  问题点数:20、回复次数:10Top

1 楼laiwusheng(风清扬)回复于 2006-05-02 07:53:50 得分 5

/*不考虑空间因素,这样可以:*/  
  #include<stdio.h>  
  #define   N   3  
  int   main()  
  {  
          int   arr[N][N]={1,2,3,4,5,6,7,8,9},i,j,a[N][N];  
          /*  
          for(i=0;i<N;i++)  
            for(j=0;j<N;j++)  
                scanf("%d",&arr[i][j]);  
          */  
          for(i=0;i<N;i++){  
            for(j=0;j<N;j++)  
                printf("%d\t",arr[i][j]);  
            printf("\n");  
            }  
          printf("\n\n");  
           
          for(i=0;i<N;i++)  
            for(j=0;j<N;j++)  
                a[i][j]=arr[j][i];  
                                                           
          for(i=0;i<N;i++){  
            for(j=0;j<N;j++)  
                printf("%d\t",a[i][j]);  
            printf("\n");  
            }  
             
          system("pause");  
          return   0;  
  }  
  Top

2 楼f_acme(沧海一声笑)回复于 2006-05-02 09:37:55 得分 5

考虑空间的话就这样了:  
   
  #include<stdio.h>  
  #define   N   3  
  int   main()  
  {  
  int   a[N][N]   =   {1,2,3,4,5,6,7,8,9};  
  int   i,j;  
   
  for(i=0;   i<(N+1)/2;   i++)  
  {  
  for(j=i+1;   j<N;   j++)  
  {  
  a[i][j]   +=   a[j][i];  
  a[j][i]   =   a[i][j]   -   a[j][i];  
  a[i][j]   =   a[i][j]   -   a[j][i];  
  }  
  }  
  for(i=0;   i<N;   i++)  
  {  
  for(j=0;   j<N;   j++)  
  {  
  printf("%d   ",a[i][j]);  
  }  
  printf("\n");  
  }  
  return   0;  
  }  
  Top

3 楼xyjchinese(春天把老婆种到地下后我就急切的盼望秋天的到来)回复于 2006-05-02 11:11:54 得分 0

转置前是  
  1       2       3  
  4       5       6  
  7       8       9  
  转置后不是应该是下面这样的吗?  
  9       8       7  
  6       5       4  
  3       2       1  
   
  而且题目要求不能用另外一个数组,只能用arr这一个数组来转置。Top

4 楼roli1982(roli)回复于 2006-05-02 11:18:57 得分 0

转置不是行变列,列变行么,是你写的那样么Top

5 楼xyjchinese(春天把老婆种到地下后我就急切的盼望秋天的到来)回复于 2006-05-02 12:32:59 得分 0

哦,可是那题目要求不能用第二个数组啊Top

6 楼Error_Code(void)回复于 2006-05-02 13:04:58 得分 0

转置前是  
  1       2       3  
  4       5       6  
  7       8       9  
  转置后不是应该是下面这样的吗?  
  9       8       7  
  6       5       4  
  3       2       1  
  ---------------------------  
  应该是  
  1   4   7  
  2   5   8  
  3   6   9     对角线   1   5   9不动Top

7 楼roli1982(roli)回复于 2006-05-02 13:29:42 得分 5

不就是把a[i][j]   和a[j][i]的值颠一下么  
  #include<stdio.h>  
  #define   N   3  
  int   main()  
  {  
          int   arr[N][N]={1,2,3,4,5,6,7,8,9},i,j;  
          int   t;  
          /*  
          for(i=0;i<N;i++)  
            for(j=0;j<N;j++)  
                scanf("%d",&arr[i][j]);  
          */  
          for(i=0;i<N;i++){  
            for(j=0;j<N;j++)  
                printf("%d\t",arr[i][j]);  
            printf("\n");  
            }  
          printf("\n\n");  
           
          for(i=0;i<N;i++)  
            for(j=0;j<i;j++){  
                t=arr[j][i];  
                arr[j][i]=arr[i][j];  
                arr[i][j]=t;  
                }  
          for(i=0;i<N;i++){  
            for(j=0;j<N;j++)  
                printf("%d\t",arr[i][j]);  
            printf("\n");  
            }  
             
          system("pause");  
          return   0;  
  }  
  Top

8 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-05-02 14:24:25 得分 5

#include   <iostream.h>  
   
  void   main()  
  {  
  int   tMt[3][3]   =   {1,2,3,4,5,6,7,8,9};  
  int   temp;  
  int   rBound   =   3;  
  int   vBound   =   3;  
  for(int     i   =   0;   i   <   rBound;   i++   )  
  for(   int   j   =   0;   j   <   vBound;   j++   )  
  {  
  cout<<tMt[i][j]<<'   ';  
  if(j   ==   vBound   -   1)  
  cout<<endl;  
  }  
   
  cout   <<   endl;  
  for(   i   =   0;   i   <   rBound;   i++   )  
  for(   int   j   =   i+1;   j   <   vBound;   j++   )  
  {  
  temp   =   tMt[i][j];  
  tMt[i][j]   =   tMt[j][i];  
  tMt[j][i]   =   temp;  
  }    
   
  for(     i   =   0;   i   <   rBound;   i++   )  
  for(   int   j   =   0;   j   <   vBound;   j++   )  
  {  
  cout<<tMt[i][j]<<'   ';  
  if(j   ==   vBound   -   1)  
  cout<<endl;  
  }  
  }Top

9 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-05-02 14:26:06 得分 0

以上的程序不用到第二个数组,,,   用一个temp保留。。。。。  
  for(   i   =   0;   i   <   rBound;   i++   )  
  for(   int   j   =   i+1;   j   <   vBound;   j++   )     //   对角的元素不用转置Top

10 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-05-02 14:28:22 得分 0

 
                          testing...........  
  ///////////////  
  before   converse......  
  1   2   3  
  4   5   6  
  7   8   9  
   
  after   converse......  
  1   4   7  
  2   5   8  
  3   6   9  
  Press   any   key   to   continueTop

相关问题

关键词

得分解答快速导航

  • 帖主:xyjchinese
  • laiwusheng
  • f_acme
  • roli1982
  • chenhu_doc

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo