RosettaCodeData/Task/Additive-primes/Ballerina/additive-primes.ballerina
2025-06-11 20:16:52 -04:00

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.");
}