LoginSignup
0
0

More than 1 year has passed since last update.

Dart Streamを使って素数を表示してみる

Last updated at Posted at 2022-12-16

Stream内で計算した素数をawait forで出力するコードをいくつか書いてみました。素数はfor(;;){}で無限ループさせてその中で判定させ、素数だけを出力させるようにしたいと思います。

まずは、シンプルにbool判定でループの回数を半分の位置で判定して出してみます。は必ず割れるので判定基準には入れません。

import 'dart:async';

// async関数内で await forかlisten()を使ってStreamの値を取り出す。async*内でyield(return)を使いStreamに値を返す。

Stream<int> primeNumberStream() async* {
  for(int i = 2;;i++){ 
    bool isPrime = true;
			for(int j = 2; j <= i ~/ 2; j++){
       if(i % j == 0){
         isPrime = false;
         break;
       }
      }
        if(isPrime){
          await Future.delayed(Duration(seconds: 1));
        yield i;
    }
  }
}

void main() async {   
  await for(int p in primeNumberStream()){
    print(p);
  }
}

次は高速化させて3から割るパターンです。2は予めプリントしておき、countを設けてインクリメントで判定させます。

import 'dart:async';

Stream<int> primeNumberStream() async* {
  print("2");
  for (int i = 3; ; i+=2) {
    int count = 0;
    for (int j = 1; j < i; j++) {
      if (i % j == 0) {
        count++;
      }
    }
    if (count == 1) {
      await Future.delayed(Duration(seconds: 1));
      yield i;
    }   
  }
}

main() async {
  await for(int p in primeNumberStream()){
    print(p);
  }
}

今度はcountを取り除きfor文の中の条件式で判定させたパターンです。

import 'dart:async';

Stream<int> primeNumberStream() async* {  
  print("2");
  for(int i = 2; ;i++){ 
			for(int j = 3; (i % j != 0 && 
 j < i) || j == i; j += 2){
        if(j == i){
          await Future.delayed(Duration(seconds: 1));
        yield i;
        }
    }
  }
}

void main() async {   
  await for(int p in primeNumberStream()){
    print(p);
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0