相比起我們一般用二層迴圈遍歷二維陣列,用一層迴圈不見得有效率上的優勢。
但是在某些場合卻能方便人們理解和使用。
今天我要使用這個的時候,卻發現我有點忘了,然後想明白之後記錄於此。
實質其實還是先行後列的遍歷方式, 利用的是求餘和整除兩種運算。
假定我們要遍歷的是20*20的整數型陣列,一層迴圈的迴圈變數為n。
首先是在c語言這類以0作為陣列一維的第乙個下標的系統:
我們可以用乙個從0到399的迴圈,那麼在迴圈中要訪問的乙個陣列元素的行標可為n/20,列標可為n%20。
這裡主要需要考慮的是行列標的變動範圍和邊界值,n為0-19時,行標一直為0(整除!),列標分別為0-19(%20後的值範圍就是0-19);
當n=20(第21次迴圈,輪到第二行第一列的元素了),n/20=1;n%20=0
如果你硬是要讓迴圈從1開始到400,那麼你就將上面提到的n變成(n-1)好了。
我們再來看以1作為陣列一維的第乙個下標的系統(例如:易語言):
這次我們先討論迴圈從1到400,那麼在迴圈中要訪問的乙個陣列元素的行列標就不是上面那麼簡單了。
先來看行標,同樣的,我們利用除法 也是n/20麼?不是的,對了,1是起始下標,那麼我們給他加個1,即n/20+1對麼?
也不對,考慮n=20的時候(第20次迴圈,輪到第一行第二十個元素),n/20+1=2了,跳到第二行去了。
我們這樣處理,應該為n/21+1,我們考慮跳行的邊界值n=20、40、60……如果是除以20,那麼這將提前跳行了,不是想要的結果。
因為剛剛好除出來整數了,而換成21之後就避開了這種情況。x*20/21=x-1 (整數運算)
再來看看列標,+1是必需的,但是答案不是n%20+1,而是(n-1)%20+1。
還是考慮跳行的邊界值n=20、40、60……如果是前者,還是因為剛剛好除出來整數了,餘數為零了,那麼這將提前跳列了,不是想要的結果。
如果你硬是要讓迴圈從0開始到399,那麼你就將上面提到的n變成(n+1)好了。
這個問題不是很難的,怎麼費了這麼多唇舌還好像說的不是很清楚?
for迴圈遍歷二維陣列 巢狀元素
關於for迴圈這是js中的重點,特別是專案中會經常用到,並且它的運用範圍還極其的廣泛,極其的複雜,今天就來遍歷乙個多層巢狀的元素,先來看看簡單的布局 1 ul id list 2 li 3 h2 我的好友 h2 4 ul 5 li 張安 li 6 li 李三 li 7 li 張四 li 8ul 9l...
遍歷二維陣列
二維陣列的初始化和如何用foreach輸出,需要注意的是,tdarray.length是二維陣列的個數,tdarray.length i 是第i 1的陣列的長度 public static void main string args for int i 0 i 獲取二維陣列中的最大值max int ...
二維陣列及二維陣列的遍歷
一 如果陣列的元素是一維陣列 則該陣列是二維陣列 如果陣列的元素是二維陣列 則該陣列是三維陣列 注意 二維陣列的長度 是陣列內一維陣列的個數 獲取二維陣列內的元素 第一步獲取該元素在哪乙個一維陣列內 第二步獲取該元素在一維陣列的那個位置 false var arr 1,2,3 var arr1 你好...