Problem p03352 (C++)

Buggy submission (status: Time Limit Exceeded):
// include
// ------------------------------------------------
#include <algorithm>
#include <bits/stdc++.h>
#include <math.h>
#include <vector>

using namespace std;

// func
// ------------------------------------------------
int CalcSumOfDigit(int n); // 各桁の和を計算する。
string upper(string str);  // 英字を大文字に変換する。
string lower(string str);  // 英字を小文字に変換する。

// define
// ------------------------------------------------
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define sz(a) int((a).size())
#define rep(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define repe(i, n) for (int(i) = 0; (i) <= (n); (i)++)
#define vsort(v) sort((v).begin(), (v).end())
#define rvsort(v) sort(rall((v)))
#define vi vector<int>
#define GCD(a, b) __gcd((a), (b))
#define LCM(a, b) (a) / GCD((a), (b)) * (b)
#define kiriage(a, b) ((a) + (b)-1) / (b)

const int INF = 1e9;

// code
// ------------------------------------------------
int main() {

  int x;
  cin >> x;

  for (int i = x; x > 0; i--) {
    // i がべき乗数か調べる
    for (int j = 2; j < sqrt(i) + 1; j++) {
      // iを割れるやつがあったら、割りまくってみる
      if (i % j == 0) {
        int b = i;
        bool chk = true;
        for (int k = 1; k <= 10; k++) {
          // 割まくれるか？
          if (b == j) {
            break;
          } else if (b % j != 0) {
            chk = false;
            break;
          } else {
            b /= j;
          }
        }
        if (chk) {
          cout << i << endl;
          return 0;
        }
      }
    }
  }

  return 0;
}
// funcの実体
// ------------------------------------------------
int CalcSumOfDigit(int n) {
  int s = 0;
  while (n) {
    s += n % 10;
    n = n / 10;
  }
  return s;
}

string upper(string str) {
  for (auto itr = str.begin(); itr != str.end(); itr++) {
    if (97 <= *itr && *itr <= 122) {
      *itr = *itr - 32;
    }
  }
  return str;
}

string lower(string str) {
  for (auto itr = str.begin(); itr != str.end(); itr++) {
    if (65 <= *itr && *itr <= 90) {
      *itr = *itr + 32;
    }
  }
  return str;
}


Fixed submission:
// include
// ------------------------------------------------
#include <algorithm>
#include <bits/stdc++.h>
#include <math.h>
#include <vector>

using namespace std;

// func
// ------------------------------------------------
int CalcSumOfDigit(int n); // 各桁の和を計算する。
string upper(string str);  // 英字を大文字に変換する。
string lower(string str);  // 英字を小文字に変換する。

// define
// ------------------------------------------------
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define sz(a) int((a).size())
#define rep(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define repe(i, n) for (int(i) = 0; (i) <= (n); (i)++)
#define vsort(v) sort((v).begin(), (v).end())
#define rvsort(v) sort(rall((v)))
#define vi vector<int>
#define GCD(a, b) __gcd((a), (b))
#define LCM(a, b) (a) / GCD((a), (b)) * (b)
#define kiriage(a, b) ((a) + (b)-1) / (b)

const int INF = 1e9;

// code
// ------------------------------------------------
int main() {

  int x;
  cin >> x;

  if (x == 1) {
    cout << 1 << endl;
    return 0;
  }

  for (int i = x; x > 0; i--) {
    // i がべき乗数か調べる
    for (int j = 2; j < sqrt(i) + 1; j++) {
      // iを割れるやつがあったら、割りまくってみる
      if (i % j == 0) {
        int b = i;
        bool chk = true;
        for (int k = 1; k <= 10; k++) {
          // 割まくれるか？
          if (b == j) {
            break;
          } else if (b % j != 0) {
            chk = false;
            break;
          } else {
            b /= j;
          }
        }
        if (chk) {
          cout << i << endl;
          return 0;
        }
      }
    }
  }

  return 0;
}
// funcの実体
// ------------------------------------------------
int CalcSumOfDigit(int n) {
  int s = 0;
  while (n) {
    s += n % 10;
    n = n / 10;
  }
  return s;
}

string upper(string str) {
  for (auto itr = str.begin(); itr != str.end(); itr++) {
    if (97 <= *itr && *itr <= 122) {
      *itr = *itr - 32;
    }
  }
  return str;
}

string lower(string str) {
  for (auto itr = str.begin(); itr != str.end(); itr++) {
    if (65 <= *itr && *itr <= 90) {
      *itr = *itr + 32;
    }
  }
  return str;
}