67 lines
1.6 KiB
Text
67 lines
1.6 KiB
Text
import ballerina/io;
|
|
|
|
function sumDigits(int m) returns int {
|
|
int n = m; // make mutable
|
|
int sum = 0;
|
|
while n > 0 {
|
|
sum += n % 10;
|
|
n /= 10;
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
function isPrime(int n) returns boolean {
|
|
if n < 2 { return false; }
|
|
if n % 2 == 0 { return n == 2; }
|
|
if n % 3 == 0 { return n == 3; }
|
|
int d = 5;
|
|
while d * d <= n {
|
|
if n % d == 0 { return false; }
|
|
d += 2;
|
|
if n % d == 0 { return false; }
|
|
d += 4;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function getPrimes(int n) returns int[] {
|
|
if n < 2 { return []; }
|
|
if n == 2 { return [2]; }
|
|
int k = (n - 3) / 2 + 1;
|
|
boolean[] marked = [];
|
|
marked.setLength(k);
|
|
foreach int i in 0..<k { marked[i] = true; }
|
|
float f = (<float>n).sqrt().floor();
|
|
int lim = (<int>f - 3) / 2 + 1;
|
|
foreach int i in 0..<lim {
|
|
if marked[i] {
|
|
int p = 2 * i + 3;
|
|
int s = (p * p - 3) / 2;
|
|
int j = s;
|
|
while j < k {
|
|
marked[j] = false;
|
|
j += p;
|
|
}
|
|
}
|
|
}
|
|
int[] primes = [2];
|
|
foreach int i in 0..<k {
|
|
if marked[i] { primes.push(2 * i + 3); }
|
|
}
|
|
return primes;
|
|
}
|
|
|
|
public function main() {
|
|
io:println("Additive primes less than 500:");
|
|
int[] primes = getPrimes(499);
|
|
int count = 0;
|
|
foreach int p in primes {
|
|
if isPrime(sumDigits(p)) {
|
|
count += 1;
|
|
string ps = p.toString().padStart(3);
|
|
io:print(ps, " ");
|
|
if count % 10 == 0 { io:println(); }
|
|
}
|
|
}
|
|
io:println("\n\n", count, " additive primes found.");
|
|
}
|