小數的迴圈節

2021-08-22 06:40:50 字數 1595 閱讀 9013

輸入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輸出格式 ...