区間内の素数

for (int j = 2; j * j < b; j += i) {
    // 処理
}

をRustで書くと、for文ではなく、while文になる。Rustの場合、for文は基本、for i in hoge となるから

let mut j = 2;
while j * j < b {
    // 処理
    j += i;
}
fn segment_sieve(a: i64, b: i64) {
   let mut is_prime[bool; 22];
   let mut is_prime_small[bool; 37];

   for i in 0.. {
      if i*i < b {
         break;
      }
      is_prime_small[i] = true;
   }

   for i in 0.. {
      if i < b - a {
         break;
      }
      is_prime[i] = true;
   }

   for i in 2.. {
      if i * i < b {
         break;
      }
      if is_prime_small[i] {
         let mut j = 2 * i;
         while  j * j < b {
            j += i;
            is_prime_small[j] = false;
         }

         let mut j = max(2LL, (a + i - 1) / i) * i;
         while j < b {
            j = j + i;
            is_prime[j - a] = false;
         }
      }
   }
}