Problem p00009 (C++) — buggy submission, verdict: Runtime Error

// IncludingFiles
#include <cmath>
#include <iostream>
#include <vector>

// Defines
#define MAX_NUMBER (999999)
#define MIN_NUMBER (1)
// #define     __DEBUG__

// Using Namespace
using namespace std;

// Function
int main() {
  vector<int> PrimeNumbers;
  vector<int> input;
  int buf;
  int sz, maxn;
  int i, root;

  // 入力
  while (cin >> buf) {
    // 入力値のチェック
    if ((buf < ((int)(MIN_NUMBER))) || (buf > ((int)(MAX_NUMBER)))) {
      cerr << "InputError!!" << endl;
      cerr << "The number has to more than " << (((int)(MIN_NUMBER)) - 1);
      cerr << " and less than " << (((int)(MAX_NUMBER)) + 1) << "." << endl;
    } else {
      // 問題がなければ入力値をリストに追加
      input.push_back(buf);
    }
  }

  // n の最大値を求めて maxn に代入
  sz = (int)input.size();
  maxn = input[0];
  for (i = 1; i < sz; i++) {
    if (maxn < input[i]) {
      maxn = input[i];
    }
  }

  // 素数2 を 素数表PrimeNumbers に追加
  PrimeNumbers.push_back(2);

  // 3 から maxn までの整数が素数かどうかを調べ、素数であれば 素数表PrimeNumbers
  // に追加
  for (i = 3; i <= maxn; i += 2) {
    // root に i の平方根を代入
    root = (int)sqrt(i);
    // sz に 素数表PrimeNumbers の大きさを代入
    sz = (int)PrimeNumbers.size();
    // i が 素数表PrimeNumbers に含まれている素数で割り切れないかを確認
    for (buf = 0; (buf < sz) && (PrimeNumbers[buf] <= root); buf++) {
      if ((i % PrimeNumbers[buf]) == 0) { // もし割り切れたら
        goto NotPrime;                    // i を素数表に追加しない
      }
    }
    // i は素数である ならば i を 素数表PrimeNumbers に追加
    PrimeNumbers.push_back(i);
  // ここにジャンプする
  NotPrime:;
  }

  // n 以下の素数の個数を計測
  sz = (int)input.size();
  for (i = 0; i < sz; i++) {
    // input[i] == 1  ならば  0 [個]を出力
    if (input[i] == 1) {
      cout << 0 << endl;
      continue;
    }

    // a, b および flag の宣言・初期化
    int a = 0, b = (int)PrimeNumbers.size() - 1, m, n;
    bool flag = false;

    // PrimeNumbers の最大値 <= input[i] となっていないかどうかを調べる
    if (PrimeNumbers[b] <= input[i]) {
      n = b;
      flag = true;
    }

    // 二分検索
    while (flag == false) {
      m = (a + b) / 2;
      if (PrimeNumbers[m] > input[i]) {
        b = m;
      } else if ((PrimeNumbers[m] <= input[i]) &&
                 (PrimeNumbers[m + 1] > input[i])) {
        n = m;
        flag = true;
      } else if (PrimeNumbers[m] < input[i]) {
        a = m;
      } else {
        cerr << "BinarySearchError!!" << endl << endl;
        cerr << "PrimeNumbers[" << m << "] = " << PrimeNumbers[m] << endl;
        cerr << "PrimeNumbers[" << (m + 1) << "] = " << PrimeNumbers[m + 1]
             << endl;
        cerr << "input[" << i << "] = " << input[i] << endl;
        return -1;
      }
    }

    // 出力
    cout << (n + 1) << endl;
  }

  return 0;
}

Error: 0

Fixed submission:

// IncludingFiles
#include <cmath>
#include <iostream>
#include <vector>

// Defines
#define MAX_NUMBER (999999)
#define MIN_NUMBER (1)
// #define     __DEBUG__

// Using Namespace
using namespace std;

// Function
int main() {
  vector<int> PrimeNumbers;
  vector<int> input;
  int buf;
  int sz, maxn;
  int i, root;

  // 入力
  while (cin >> buf) {
    // 入力値のチェック
    if ((buf <= ((int)(MIN_NUMBER))) || (buf > ((int)(MAX_NUMBER)))) {
      cerr << "InputError!!" << endl;
      cerr << "The number has to more than " << ((int)(MIN_NUMBER));
      cerr << " and less than " << (((int)(MAX_NUMBER)) + 1) << "." << endl;
    } else {
      // 問題がなければ入力値をリストに追加
      input.push_back(buf);
    }
  }

  // n の最大値を求めて maxn に代入
  sz = (int)input.size();
  maxn = input[0];
  for (i = 1; i < sz; i++) {
    if (maxn < input[i]) {
      maxn = input[i];
    }
  }

  // 素数2 を 素数表PrimeNumbers に追加
  PrimeNumbers.push_back(2);

  // 3 から maxn までの整数が素数かどうかを調べ、素数であれば 素数表PrimeNumbers
  // に追加
  for (i = 3; i <= maxn; i += 2) {
    // root に i の平方根を代入
    root = (int)sqrt(i);
    // sz に 素数表PrimeNumbers の大きさを代入
    sz = (int)PrimeNumbers.size();
    // i が 素数表PrimeNumbers に含まれている素数で割り切れないかを確認
    for (buf = 0; (buf < sz) && (PrimeNumbers[buf] <= root); buf++) {
      if ((i % PrimeNumbers[buf]) == 0) { // もし割り切れたら
        goto NotPrime;                    // i を素数表に追加しない
      }
    }
    // i は素数である ならば i を 素数表PrimeNumbers に追加
    PrimeNumbers.push_back(i);
  // ここにジャンプする
  NotPrime:;
  }

  // n 以下の素数の個数を計測
  sz = (int)input.size();
  for (i = 0; i < sz; i++) {
    // a, b および flag の宣言・初期化
    int a = 0, b = (int)PrimeNumbers.size() - 1, m, n;
    bool flag = false;

    // PrimeNumbers の最大値 <= input[i] となっていないかどうかを調べる
    if (PrimeNumbers[b] <= input[i]) {
      n = b;
      flag = true;
    }

    // 二分検索
    while (flag == false) {
      m = (a + b) / 2;
      if (PrimeNumbers[m] > input[i]) {
        b = m;
      } else if ((PrimeNumbers[m] <= input[i]) &&
                 (PrimeNumbers[m + 1] > input[i])) {
        n = m;
        flag = true;
      } else if (PrimeNumbers[m] < input[i]) {
        a = m;
      } else {
        cerr << "BinarySearchError!!" << endl << endl;
        cerr << "PrimeNumbers[" << m << "] = " << PrimeNumbers[m] << endl;
        cerr << "PrimeNumbers[" << (m + 1) << "] = " << PrimeNumbers[m + 1]
             << endl;
        cerr << "input[" << i << "] = " << input[i] << endl;
        return -1;
      }
    }

    // 出力
    cout << (n + 1) << endl;
  }

  return 0;
}