2016-05-05 6 views
-1

対称行列をn * mよりも少ない反復で印刷する方法はありますか?n * mより反復回数が少ない対称行列を印刷

i

for (int i = 1; i <= n; ++i) { 
    for (int j = i; j <= m; ++j) { 
     System.out.print(i * j + " "); 
    } 
    System.out.println(); 
} 

for (int i = 1; i <= n; ++i) { 
    for (int j = 1; j <= m; ++j) { 
     System.out.print(i * j + " "); 
    } 
    System.out.println(); 
} 

答えて

0

スタートj時のみn == m動作し、行列が対称であるならば、これは短い行

1

の前には、それが次なるためにパッドを持っていません、意味はm == nです。それからそれはm*(m+1)/2の独立した要素を持っています。それはあなたがアクセスする必要がある要素の数であり、おそらく反復の数を意味します。 print関数を使用して画面上の印刷要素の位置を指定できる場合、2つの要素(i、jおよびj、i)を1回の反復で印刷できます。

ただし、System.out.printを使用すると、これはできません。

0

反復回数がn * mより少ない対称行列を印刷する方法はありますか?小さいよりn*msystem.out.println()

印刷が可能ではありません。しかし、行列の更新について質問している場合はが可能ですです。

行列が対称である場合、行列の半分は他の半分(対角線上)で表示されるため、行列の半分だけを反復する必要があります。 2つの要素を同時に更新すると(最初に&、最後に+1、最後に1.など)、完全な対称行列が更新されます。

マトリックスをプリントアウトしたい場合は、明らかにマトリックスのすべての要素を反復処理する必要があります。例えば

int r = 7; 
int c = 7; 

int[][] matrix = new int[r][c]; 
for(int x=0; x<=r; x++) 
    for(int y=0; y<r-x; y++){ 
     matrix[x][y] = Math.min(x, y);   //Update 1st diagonal half of the matrix 
     matrix[r-x-1][c-y-1] = matrix[x][y]; //Update the next half (follow 1st half) 
    } 

マトリックス値:

0000000 
0111110 
0122210 

0122210 
0111110 
0000000 
0

はいことが可能である:単にここで提供アルゴリズムのいずれかを使用する代わりのマトリックスconcatene結果を埋めますRの文字列に変換する。 最後にR文字列を印刷します。

これは(c * r)/ 2 + rの繰り返しを与えます。

擬似コード:

int rows = 7; int cols = 7; 

List<String> previous = new List<String>(rows); 

for(int x=0; x<=rows; x++) { 
    // if beginning of row has already been calculated then print it out 
    if (previous[y] != null) System.out.print(previous); 

    // then start at X to calculate the rest of the row 
    for(int y=x; y<=cols; y++){ 
     System.out.print(x*y);   
     previous[y] += " " + x*y; 
    } 
} 
関連する問題