Kotlin演算法入門求完全數
阿新 • • 發佈:2019-02-10
/*一個數如果恰好等於它的因子之和,這個數就稱為 "完數 "。*/ class CompleteNumber { private var firstFactorNumber: Int = 0 /** * 因為不管怎麼計算由於非素數數都可以通過1·9中通過乘計算得出所以除了1和2只需要繼續是否可以被2-9整除就可以 * 這一說法利用了提取最小公因式來計算得出 * 當然要避免一個重要問題就是當它是個位數字的時候也就是1 、 2 、 3 、 5 、7的時候直接返回 * 這樣計算的好處在於避免了傳統遞迴從1到n的反覆計算更加高效的計算出素數面對千位以上的資料使用* 也避免了過多使用這一演算法(冗餘重複性計算)的: * 判斷素數的方法:用一個數分別去除2到sqrt(這個數的平方根),如果能被整除, 則表明此數不是素數,反之是素數這一種演算法更加快捷 * 避免了重複計算的冗餘 */ fun isPrimeNumber(divisor: Int, number: Int): Boolean { if (number % divisor == 0) { firstFactorNumber = divisor return false } if(number == 1 || number == 2 || number == 3 || number == 5 || number == 7 || number == 11 || number == 13 || number == 17 || number == 19) return true else if (number <= 20) { firstFactorNumber = 1 return false } else if (divisor == 9) { return isPrimeNumber(11, divisor) } else if (divisor > 9) { if (divisor < Math.sqrt(number.toDouble())) { return isPrimeNumber(divisor + 1, number) } else if (divisor.toDouble() == Math.sqrt(number.toDouble())) { firstFactorNumber = divisor return false } else return true } return isPrimeNumber(divisor + 1, number) } /*呼叫優化演算法*/ fun isCompleteNumber(number: Int) { if (number < 6) { println("從1到" + number + "沒有完全數") } else { for (i in 6..number) { /*素數不可能是完全數所以可以計算直接跳過 * 每一次計算判斷素數的時候如果不是通過計算 * 是否為素數出的第一個因數+1為起始點進行計算避免起點重複計算*/ if (isPrimeNumber(2, number)) continue var sum = 0 if (firstFactorNumber > 1) sum += 1 + firstFactorNumber else if (firstFactorNumber == 1) sum += 1 for (j in firstFactorNumber + 1 until i) { if (i % j == 0) { sum = sum + j } } if (sum == i) { println(i) } } } } /*傳統做法*/ fun tradition() { var s: Int for (i in 1..1000000) { s = 0 for (j in 1 until i) if (i % j == 0) s = s + j if (s == i) print(i.toString() + " ") } println() } }