2012-09-30 30 views
1

該程序的目標是創建一個二維網格值。我們得到用戶輸入的元素總數(例如,n)。我們需要構建的n值的2D網格(這些值是連續的從0開始的,即,0,1,2,3,4,5,6..n)給定一個數字,構建二維網格的程序

For n=9, 

0 1 2 
3 4 5 
6 7 8 

For n=6, 

Either, 
0 1 2 
3 4 5 
or 
0 1 
2 3 
4 5 

下面是我所管理直到現在:

int rowlen = (sqrt(n)) 
int collen = (n/rowlen) 
int no = 0; 

for (int i = 0; i < rowlen-1) { 
    for (int j = 0; j < collen-1) { 

     System.out.print(no+"\t") 
     no++; 

    } 

    System.out.println() 
} 

上述代碼適用於完美的平方數和其他'n'均勻的情況。 但是,如果'n'是奇數並且其他偶數值爲'n',例如n = 10,則失敗。

你可以請建議一個更好的方法來構建網格?

回答

1

Prime factorization - for example: given 6, finding 3*2 - is one of the great challenges of modern computing.最簡單也是最可靠的方法就是迭代。 (即可以被1整除嗎?可以被2整除?是否可以被3整除......)

好消息是你反覆迭代!因此,不要試圖通過猜測因子(rowlencollen)開始迭代輸出,並檢查每個數字,看看它是否是一個因素!一旦你找到一個,那麼你應該打擾你決定有多少行和列。

類似的信息(僞代碼):

var n = 10; 

var cols = 0; 

for(var i=0; i<n; i++) { 
    if(i>1 && ((cols === 0 && n%i === 0) || (cols>0 && i%cols===0))) { 
     if(cols===0) { // we've found our first prime factor; 
         // this value will be used as the number of columns 
      cols = i; 
     } 
     print("\n"); 
    } 
    print(i); 
} 
+0

感謝理查德JP勒岡,你的想法給了我一個方向。我現在正在跟你給的鏈接。同時,我複製了你在java中提供的代碼片斷,並由於下面的代碼而得到了算術異常:if(i> 1 &&(n%i === 0 || i%cols === 0))cols = 0對於i = 2或更多,i%cols給出例外。 –

+0

Uhhhh我沒有看到你的「下線」:P –

+0

另外,除非你是研究生水平的compsci或數學學生,否則我不建議梳理維基百科頁面上的素因子分解。我也不禁止你;我鼓勵你按照你的好奇心......但要警惕它可能沒有用處 - 如果你能解決問題,你可能在一夜之間富起來或在睡夢中被間諜謀殺:P –