Private Sub Command1_Click()
創(chuàng)新互聯(lián)公司主營康縣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),康縣h5微信小程序定制開發(fā)搭建,康縣網(wǎng)站營銷推廣歡迎康縣等地區(qū)企業(yè)咨詢
Dim a(1 To 100) As Integer
Dim i As Integer, j As Integer, k As Integer
For i = 1 To 100 '給數(shù)組a一百個元素賦值,并換每行十個數(shù)字輸出來窗體上
a(i) = Int(Rnd * 101)
k = k + 1
Print Tab((k - 1) * 5); a(i);
If k = 10 Then k = 0: Print
Next i
For i = 100 To 2 Step -1 '用冒泡排序法對數(shù)組進(jìn)行排序
For j = 1 To i - 1
If a(j) a(j + 1) Then
t = a(j): a(j) = a(j + 1): a(j + 1) = t
End If
Next j
Next i
For i = 1 To 100 '輸出排好序的數(shù)組
k = k + 1
Print Tab((k - 1) * 5); a(i);
If k = 10 Then k = 0: Print
Next i
End Sub
private function maxnum(byval a() as integer) as integer
dim i as integer
maxnum=a(0)
for i = 1 to ubound(a)
if a(i)maxnum then maxnum=a(i)
next
end function
double是雙精度 有效數(shù)值位52位 表示成指數(shù)的形式 即指數(shù)11位 即表示成
所以180.89305用2進(jìn)制表示是10110100.1110010010011110111011001011111110110001010110110101
即
180.89305在double中存在的實際數(shù)值是
1.01101001110010010011110111011001011111110110001010110110101 *2^7
取小數(shù)點后 52位有效值后 等于10進(jìn)制的180.893049999999998
所及加最后變成了 1808930.99999999998
第一次當(dāng)然輸出近似值1808931
第二次int函數(shù)去掉了小數(shù)點后的數(shù)int就是只取整數(shù)的部位的不是四舍五入 所以少了1
可以用Rnd函數(shù)實現(xiàn)
Rnd 函數(shù)返回小于 1 但大于或等于 0 的值。
為了生成某個范圍內(nèi)的隨機整數(shù),可使用以下公式:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
這里,upperbound 是隨機數(shù)范圍的上限,而 lowerbound 則是隨機數(shù)范圍的下限。
你這里可以先把范圍擴大10倍,看成21到34之間的隨機數(shù),最后再除以10就行了。
Int((34 - 21 + 1) * Rnd + 21) / 10
看了你說遞歸的效率低。那么你可以不用的。
給出的方法就是先生成第一個排列,然后每次調(diào)用下面的函數(shù)給出下一個排列,這樣生成的效率很高,這個函數(shù)可以內(nèi)聯(lián)。
這個是很經(jīng)典的排列組合算法???在網(wǎng)上能搜到一大堆。
大概是那種帶指向的移動的算法。我給你搜一個吧。
我找了幾個,這個是我覺得說的比較清楚的,你可以仔細(xì)參考一下,看不懂的話再搜點別的好了。。
全排列的算法跟這個不太一樣的。需要有點改動的。
至于語言的話,應(yīng)該不會有太大問題吧。。basic版的確實比較少,現(xiàn)在我也比較懶不想動手寫。。還是要靠你自己啦。
★生成排列的算法:
比如要生成5,4,3,2,1的全排列,首先找出一個最小的排列12345, 然后依次調(diào)用n!次STL算法中的next_permutation()即可輸出所有的全排列情況。所以這種算法的細(xì)節(jié)就是STL algorithm中next_permutation()的實現(xiàn)機制。詳細(xì)的實現(xiàn)代碼,大伙可以參考侯捷的《STL源代碼剖析》,在這里我只說一下我的理解:
1 首先從最尾端開始往前尋找兩個相鄰元素,令第一個元素為*i,第二個元素為*ii,且滿足*i*ii,找到這樣一組相鄰的元素后。
2 再從最尾端開始往前檢驗,找出第一個大于*i的元素,令為*k,將i,k元素對調(diào)。
3 再將ii及ii之后的所有元素顛倒排列,此即所求之"下一個"排列。
prev_permutation()算法的思路也基本相同,只不過它們尋找的"拐點"不同,在next_permutation()算法中尋找的是峰值拐點,而在prev_permutation()算法中尋找的是谷值拐點。另外,在第二步中,prev_permutation()要找的是第一個小于*i的元素而不是第一個大于*i的元素。
具體例子,有空再舉,現(xiàn)在時間太晚了:)
★生成組合的算法:
如下面截圖所示,分全組合和r-組合兩種情況。
這里有一段核心代碼:
//--------------------------------------------------------
// Generate next combination (algorithm from Rosen p. 286)
//--------------------------------------------------------
public int[] getNext () {
if (numLeft.equals (total)) {
numLeft = numLeft.subtract (BigInteger.ONE);
return a;
}
int i = r - 1;
while (a[i] == n - r + i) {
i--;
}
a[i] = a[i] + 1;
for (int j = i + 1; j r; j++) {
a[j] = a[i] + j - i;
}
numLeft = numLeft.subtract (BigInteger.ONE);
return a; //這里返回的a數(shù)組,存儲的就是下標(biāo)的排列組合。
}
到這里,也許大伙會有一個疑問,假如要求的不是數(shù)字的排列組合,而是字符或字符串的排列組合呢?怎么辦?其實很簡單,你只要拿數(shù)組的下標(biāo)來做排列組合,返回他們下標(biāo)的排列組合,然后再到原數(shù)組中讀取字符串值,就可以輸出全部的排列組合結(jié)果。
沒有“十進(jìn)制整數(shù)型表示范圍”的說法,是整型或長整型類型的表示范圍,每種數(shù)值類型都有常數(shù),如Integer的最大值和最小值:Integer.MaxValue ,Integer.MinValue 。鼠標(biāo)停留在這個語句上時會顯示它的數(shù)值的。integer是32位的,大概有個20億的正負(fù)值吧。