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
dartList<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.
dartList<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)
dartbool 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
dartextension 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
dartclass 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
| Method | Time Complexity | Space Complexity | Speed (0-100) |
|---|---|---|---|
| Simple | O(n × n/2) | O(1) | Slow |
| Optimized | O(n × √n) | O(1) | Medium |
| Sieve | O(n log log n) | O(n) | Very fast |
Expected Output (0 to 100)
textPrime 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
| Practice | Recommendation |
|---|---|
| Range checking | Always validate input (< 2 returns empty) |
| Optimization | Use Sieve for large ranges (> 1000) |
| Edge cases | Handle 0, 1, 2 separately |
| Memory | Sieve uses O(n) memory - consider for very large n |