輸入n/d的形式,其中n為分子,d為分母。
如得出的結果小數部分存在迴圈,就用括號括起來 ,如1/3=0.(3);22/5=4.4 ;1/7=(142857)
function xunhuan(byval n as long, byval d as long) as string '請依次輸入n/d得形式,其中n為分子,d為分母
if n mod d = 0 then '整除
xunhuan = n & "÷" & d & "=" & n / d
exit function
else
dim digit() as string, flag() as long, temp as double, temp2 as long, i as long, k as integer
redim digit(1 to d + len(cstr(d))) '定義最長不重複位數
redim flag(d) '0-d 每位數字出現於小數點後的位置
xunhuan = n & "÷" & d & "=" & int(n / d) & "."
temp = n mod d '取餘
i = 2
do while i <= d + len(cstr(d)) '迴圈所有可能
if temp = 0 then '除盡了
redim preserve digit(1 to i) '前i位
xunhuan = xunhuan & join(digit, "")
exit function
end if
if flag(temp) > 1 then '重複出現
digit(flag(temp)) = "(" & digit(flag(temp)) 'flag(temp)指該數字第一次出現的位置,新增左括號
redim preserve digit(1 to i - 1)
xunhuan = xunhuan & join(digit, "") & ")" '新增右括號
exit function
else
flag(temp) = i '賦值
end if
'以下三行模擬除法運算,實現高精度除法
temp = temp * 10
digit(i) = int(temp / d) mod 10
temp = temp - int(temp / d) * d
i = i + 1
loop
end if
end function
private sub command1_click()
dim t as single
dim i as long, x(1 to 10000) as string
t = timer
for i = 1 to 10000
x(i) = xunhuan(i, 65535)
next
randomize
i = int(10000 * rnd + 1)
msgbox "計算完畢!列舉其中任意乙個:" & vbcrlf & x(i), vbinformation, "用時" & timer - t & "秒"
end sub
1035 最長的迴圈節 迴圈小數)
正整數k的倒數1 k,寫為10進製的小數如果為無限迴圈小數,則存在乙個迴圈節,求 n的數中,倒數迴圈節長度最長的那個數,假如存在多個最優的答案,輸出所有答案中最大的那個數。1 6 0.1 6 迴圈節長度為1 1 7 0.142857 迴圈節長度為6 1 9 0.1 迴圈節長度為1 輸入輸入n 10 ...
求無限迴圈小數的迴圈節長度
新手的 思路 求出小數的小數部分,需要一定的長度,可以將其儲存在陣列中 將陣列分為最長 length 2 部分,一一進行比較判斷是否是迴圈節並求出迴圈節長度 package edu.ecut public class arraytest private intgetrepeatlength int ...
藍橋杯 歷屆試題 小數第n位 迴圈小數的迴圈節
我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。本題的任務是 在上面的約定下,求整數除法小數點後的第n位開始的3位數。輸入格式 一行三個整數 a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置 0輸出格式 ...