请教将一个3X3的矩阵转置的算法
我写的这个我自己就觉得不对,还请指教一下。
#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




