Implementation of the Armstrong numbers (https://en.wikipedia.org/wiki/Narcissistic_number) search algorithm on Java.
The number S consists of M digits, for example, S = 370 and M (number of digits) = 3.
It is necessary to implement the logic of the method, which must be among natural numbers less than N (long) to find all numbers, satisfying the following criterion:
the number S is equal to the sum of its digits raised to the power of M. The program must return all such numbers in ascending order.
Example of the number:
370 = 3 * 3 * 3 + 7 * 7 * 7 + 0 * 0 * 0
8208 = 8 * 8 * 8 * 8 + 2 * 2 * 2 * 2 + 0 * 0 * 0 * 0 + 8 * 8 * 8 * 8
The execution time must not be more then 10 seconds and used memory limit is 50 mb.
4 x Intel(R) Core(TM) i5 CPU 760 @ 2.80GHz
Memory: 15.7 GiB of RAM
Execution time: 2234ms
Used memory: 5mb
Execution time: 2135ms
Used memory: 4mb
Execution time: 2m33s
Used memory: 94mb
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 153
- 370
- 371
- 407
- 1634
- 8208
- 9474
- 54748
- 92727
- 93084
- 548834
- 1741725
- 4210818
- 9800817
- 9926315
- 24678050
- 24678051
- 88593477
- 146511208
- 472335975
- 534494836
- 912985153
- 4679307774
- 32164049650
- 32164049651
- 40028394225
- 42678290603
- 44708635679
- 49388550606
- 82693916578
- 94204591914
- 28116440335967
- 4338281769391370
- 4338281769391371
- 21897142587612075
- 35641594208964132
- 35875699062250035
- 1517841543307505039
- 3289582984443187032
- 4498128791164624869
- 4929273885928088826
These numbers exist for only 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 16, 17, 19, 20, 21, 23, 24, 25, 27, 29, 31, 32, 33, 34, 35, 37, 38, and 39 digits.
The full list of the numbers is here: http://mathworld.wolfram.com/NarcissisticNumber.html
ArmstrongNumbersAll.java
is used to find all armstrong numbers (based on java.math.BigInteger
).
Execution time: 2m54s (java.lang.Long
max value)
Execution time: 4m38s
Execution time: 7m53s
Execution time: 21m6s
Execution time: 31m27s
Execution time: 47m47s
Execution time: 70m49s (1.16h)
Execution time: 103m59s (1.71h)
Execution time: 145m3s (2.36h)
Execution time: 205m3s (3.41h)
Execution time: 285m12s (4.75h)
Execution time: 395m20s (6.58h)
Execution time: 551m26s (9.18h)
Execution time: 764m19s (12.73h)
Execution time: 1047m16s (17.45h)
Execution time: 1429m46s (23.81h)
Execution time: 1914m33s (31.9h)
Execution time: 2536m56s (42.3h)
Execution time: 2536m56s (31.9h)
Execution time: > 3354m10s (55.9h)
ArmstrongNumbersAllV2.java
is also based on java.math.BigInteger
, but uses another search algorithm. This approach returns all numbers for n <= 40 in 245m17s (4h)
.
The rest of numbers:
- 63105425988599693916
- 128468643043731391252
- 449177399146038697307
- 21887696841122916288858
- 27879694893054074471405
- 27907865009977052567814
- 28361281321319229463398
- 35452590104031691935943
- 174088005938065293023722
- 188451485447897896036875
- 239313664430041569350093
- 1550475334214501539088894
- 1553242162893771850669378
- 3706907995955475988644380
- 3706907995955475988644381
- 4422095118095899619457938
- 121204998563613372405438066
- 121270696006801314328439376
- 128851796696487777842012787
- 174650464499531377631639254
- 177265453171792792366489765
- 14607640612971980372614873089
- 19008174136254279995012734740
- 19008174136254279995012734741
- 23866716435523975980390369295
- 1145037275765491025924292050346
- 1927890457142960697580636236639
- 2309092682616190307509695338915
- 17333509997782249308725103962772
- 186709961001538790100634132976990
- 186709961001538790100634132976991
- 1122763285329372541592822900204593
- 12639369517103790328947807201478392
- 12679937780272278566303885594196922
- 1219167219625434121569735803609966019
- 12815792078366059955099770545296129367
- 115132219018763992565095597973971522400
- 115132219018763992565095597973971522401