当前位置:网站首页>Kotlin算法入门求完全数
Kotlin算法入门求完全数
2022-08-11 08:01:00 【易庞宙】
/*一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。*/ 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() } }
边栏推荐
猜你喜欢

项目1-PM2.5预测

go-grpc TSL authentication solution transport: authentication handshake failed: x509 certificate relies on ... ...

1003 I want to pass (20 points)

2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处。若小球在编号为 i 的弹

少年成就黑客,需要这些技能
4.1-支持向量机

C Primer Plus(6) 中文版 第1章 初识C语言 1.7 使用C语言的7个步骤

2022 China Soft Drink Market Insights
3.1-Classification-probabilistic generative model

matrix multiplication in tf
随机推荐
2022-08-10 mysql/stonedb-slow SQL-Q16-time-consuming tracking
Four startup modes of Activity
分门别类输入输出,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本数据类型和输入输出EP03
【LeetCode】Summary of linked list problems
C语言操作符详解
【云原生】云原生在网络安全领域的应用
1046 划拳 (15 分)
Do you know the basic process and use case design method of interface testing?
Find the latest staff salary and the last staff salary changes
Machine Learning Summary (2)
1076 Wifi密码 (15 分)
CIKM 2022 AnalytiCup Competition: Federal Heterogeneous Task Learning
优炫数据库支持多列分区吗?
1046 punches (15 points)
1096 big beautiful numbers (15 points)
关于#sql#的问题:怎么将下面的数据按逗号分隔成多行,以列的形式展示出来
Serverless + domain name can also build a personal blog? Really, and soon
Write a resume like this, easy to get the interviewer
excel 透视表 值显示内容 不显示计数
1101 How many times B is A (15 points)