Question #55MediumFlutter Basics

Flutter write a function to list prime members from 0 to 100

#flutter

Answer

Overview

Finding prime numbers is a common programming challenge. A prime number is a natural number greater than 1 that has no positive divisors other than 1 and itself.


Solution 1: Simple Implementation

dart
List<int> getPrimeNumbers({int start = 0, int end = 100}) {
  List<int> primes = [];

  for (int num = start; num <= end; num++) {
    if (isPrime(num)) {
      primes.add(num);
    }
  }

  return primes;
}

bool isPrime(int number) {
  if (number < 2) return false; // 0 and 1 are not prime

  // Check if divisible by any number from 2 to sqrt(number)
  for (int i = 2; i <= number ~/ 2; i++) {
    if (number % i == 0) {
      return false; // Found a divisor, not prime
    }
  }

  return true; // No divisors found, is prime
}

void main() {
  List<int> primes = getPrimeNumbers(start: 0, end: 100);
  print('Prime numbers from 0 to 100:');
  print(primes);

  // Output: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
  print('Total primes: ${primes.length}'); // 25
}

Solution 2: Optimized (Sieve of Eratosthenes)

More efficient for large ranges.

dart
List<int> getPrimesUsingSieve(int limit) {
  if (limit < 2) return [];

  // Create boolean array, initially all true
  List<bool> isPrime = List.filled(limit + 1, true);
  isPrime[0] = isPrime[1] = false; // 0 and 1 are not prime

  // Sieve algorithm
  for (int i = 2; i * i <= limit; i++) {
    if (isPrime[i]) {
      // Mark all multiples of i as not prime
      for (int j = i * i; j <= limit; j += i) {
        isPrime[j] = false;
      }
    }
  }

  // Collect all prime numbers
  List<int> primes = [];
  for (int i = 2; i <= limit; i++) {
    if (isPrime[i]) {
      primes.add(i);
    }
  }

  return primes;
}

void main() {
  List<int> primes = getPrimesUsingSieve(100);
  print('Prime numbers: $primes');
  print('Total: ${primes.length}'); // 25
}

Solution 3: Optimized isPrime (Square Root)

dart
bool isPrimeOptimized(int number) {
  if (number < 2) return false;
  if (number == 2) return true;
  if (number % 2 == 0) return false; // Even numbers except 2

  // Only check odd numbers up to sqrt(number)
  int limit = (number ~/ 2).sqrt().toInt();
  for (int i = 3; i <= limit; i += 2) {
    if (number % i == 0) {
      return false;
    }
  }

  return true;
}

List<int> getPrimesOptimized(int limit) {
  if (limit < 2) return [];

  List<int> primes = [2]; // Start with 2

  // Only check odd numbers
  for (int num = 3; num <= limit; num += 2) {
    if (isPrimeOptimized(num)) {
      primes.add(num);
    }
  }

  return primes;
}

Solution 4: Using Extension Method

dart
extension PrimeNumbers on int {
  bool get isPrime {
    if (this < 2) return false;
    if (this == 2) return true;
    if (this % 2 == 0) return false;

    for (int i = 3; i * i <= this; i += 2) {
      if (this % i == 0) return false;
    }

    return true;
  }

  List<int> getPrimesUpTo() {
    return List.generate(this + 1, (i) => i)
        .where((num) => num.isPrime)
        .toList();
  }
}

void main() {
  // Check if number is prime
  print(17.isPrime); // true
  print(20.isPrime); // false

  // Get all primes up to 100
  List<int> primes = 100.getPrimesUpTo();
  print(primes);
}

Solution 5: Flutter Widget Example

dart
class PrimeNumbersWidget extends StatefulWidget {
  
  _PrimeNumbersWidgetState createState() => _PrimeNumbersWidgetState();
}

class _PrimeNumbersWidgetState extends State<PrimeNumbersWidget> {
  List<int> _primes = [];
  int _limit = 100;

  
  void initState() {
    super.initState();
    _calculatePrimes();
  }

  void _calculatePrimes() {
    setState(() {
      _primes = getPrimesUsingSieve(_limit);
    });
  }

  List<int> getPrimesUsingSieve(int limit) {
    if (limit < 2) return [];
    List<bool> isPrime = List.filled(limit + 1, true);
    isPrime[0] = isPrime[1] = false;

    for (int i = 2; i * i <= limit; i++) {
      if (isPrime[i]) {
        for (int j = i * i; j <= limit; j += i) {
          isPrime[j] = false;
        }
      }
    }

    return List.generate(limit + 1, (i) => i)
        .where((i) => isPrime[i])
        .toList();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Prime Numbers')),
      body: Column(
        children: [
          Padding(
            padding: EdgeInsets.all(16),
            child: Row(
              children: [
                Text('Limit: '),
                Expanded(
                  child: Slider(
                    value: _limit.toDouble(),
                    min: 10,
                    max: 500,
                    divisions: 49,
                    label: _limit.toString(),
                    onChanged: (value) {
                      setState(() => _limit = value.toInt());
                      _calculatePrimes();
                    },
                  ),
                ),
                Text('$_limit'),
              ],
            ),
          ),
          Text(
            'Found ${_primes.length} prime numbers',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
          Expanded(
            child: GridView.builder(
              padding: EdgeInsets.all(16),
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 5,
                crossAxisSpacing: 8,
                mainAxisSpacing: 8,
              ),
              itemCount: _primes.length,
              itemBuilder: (context, index) {
                return Container(
                  decoration: BoxDecoration(
                    color: Colors.blue,
                    borderRadius: BorderRadius.circular(8),
                  ),
                  child: Center(
                    child: Text(
                      '${_primes[index]}',
                      style: TextStyle(color: Colors.white, fontSize: 16),
                    ),
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

Performance Comparison

MethodTime ComplexitySpace ComplexitySpeed (0-100)
SimpleO(n × n/2)O(1)Slow
OptimizedO(n × √n)O(1)Medium
SieveO(n log log n)O(n)Very fast

Expected Output (0 to 100)

text
Prime numbers from 0 to 100:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Total primes: 25

Key Concepts

Why start from 2?

  • 0 and 1 are not prime by definition
  • 2 is the smallest and only even prime number

Why check up to √n?

  • If n = a × b, at least one of a or b must be ≤ √n
  • No need to check beyond √n

Why Sieve is fastest?

  • Eliminates multiples in bulk
  • Avoids repeated division checks

Best Practices

PracticeRecommendation
Range checkingAlways validate input (< 2 returns empty)
OptimizationUse Sieve for large ranges (> 1000)
Edge casesHandle 0, 1, 2 separately
MemorySieve uses O(n) memory - consider for very large n

Resources