Problem p00015 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
int main() {

  int n;
  cin >> n;
  for (int j = 0; j < n; j++) {
    char a[1000] = {0};
    char b[1000] = {0};
    scanf("%s%s", a, b);
    int len_a = 0, len_b = 0;
    // 長さを測る
    for (int i = 0; a[i] != 0; i++)
      len_a++;
    for (int i = 0; b[i] != 0; i++)
      len_b++;
    // もし80桁を超えてたらoverflowと出力
    if (len_a > 80 || len_b > 80) {
      printf("overflow\\n");
    }
    // 80桁を超えてなかったら
    else {
      char ans[1000] = {0};
      // aを逆向きに入れ替える
      for (int i = 0; i < len_a / 2; i++) {
        swap(a[i], a[len_a - i - 1]);
      }
      // bを逆向きに入れ替ええる
      for (int i = 0; i < len_b / 2; i++) {
        swap(b[i], b[len_b - i - 1]);
      }
      // aとbで長い方の長さをとる
      int len = max(len_a, len_b);
      // ここで足し算をする
      for (int i = 0; i < len; i++) {
        if (ans[i] != 0) {
          if (a[i] == 0 || b[i] == 0)
            ans[i] += a[i] + b[i] - '0';
          else
            ans[i] += a[i] + b[i] - '0' - '0';

        } else if (a[i] == 0 || b[i] == 0)
          ans[i] += a[i] + b[i];
        else
          ans[i] += a[i] + b[i] - '0';
        if (ans[i] >= 58) {
          ans[i + 1] += '1';
          ans[i] -= 10;
        }
      }
      // このままではansが逆向きなので入れ替える
      for (int i = 0; i < strlen(ans) / 2; i++) {
        swap(ans[i], ans[strlen(ans) - i - 1]);
      }

      int len_ans = 0;
      // ansの長さを測る
      for (int i = 0; ans[i] != 0; i++)
        len_ans++;
      // もし80桁を超えていたらoverflowと出力する
      if (len_ans > 80)
        printf("overflow");
      // それ以外なら一文字ずつ出力
      else
        for (int i = 0; ans[i] != 0; i++)
          printf("%c", ans[i]);
      printf("\\n");
    }
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
int main() {

  int n;
  cin >> n;
  for (int j = 0; j < n; j++) {
    char a[120] = {0};
    char b[120] = {0};
    scanf("%s%s", a, b);
    int len_a = 0, len_b = 0;
    // 長さを測る
    for (int i = 0; a[i] != 0; i++)
      len_a++;
    for (int i = 0; b[i] != 0; i++)
      len_b++;
    // もし80桁を超えてたらoverflowと出力
    if (len_a > 80 || len_b > 80) {
      printf("overflow\\n");
    }
    // 80桁を超えてなかったら
    else {
      char ans[120] = {0};
      // aを逆向きに入れ替える
      for (int i = 0; i < len_a / 2; i++) {
        swap(a[i], a[len_a - i - 1]);
      }
      // bを逆向きに入れ替ええる
      for (int i = 0; i < len_b / 2; i++) {
        swap(b[i], b[len_b - i - 1]);
      }
      // aとbで長い方の長さをとる
      int len = max(len_a, len_b);
      // ここで足し算をする
      for (int i = 0; i < len; i++) {
        if (ans[i] != 0) {
          if (a[i] == 0 || b[i] == 0)
            ans[i] += a[i] + b[i] - '0';
          else
            ans[i] += a[i] + b[i] - '0' - '0';

        } else if (a[i] == 0 || b[i] == 0)
          ans[i] += a[i] + b[i];
        else
          ans[i] += a[i] + b[i] - '0';
        if (ans[i] >= 58) {
          ans[i + 1] += '1';
          ans[i] -= 10;
        }
      }
      // このままではansが逆向きなので入れ替える
      for (int i = 0; i < strlen(ans) / 2; i++) {
        swap(ans[i], ans[strlen(ans) - i - 1]);
      }

      int len_ans = 0;
      // ansの長さを測る
      for (int i = 0; ans[i] != 0; i++)
        len_ans++;
      // もし80桁を超えていたらoverflowと出力する
      if (len_ans > 80)
        printf("overflow");
      // それ以外なら一文字ずつ出力
      else
        for (int i = 0; ans[i] != 0; i++)
          printf("%c", ans[i]);
      printf("\\n");
    }
  }

  return 0;
}