Go: package main

import (
	"bufio"
	"fmt"
	"math/big"
	"os"
	"strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func main() {
	sc.Scan()
	dataset, _ := strconv.Atoi(sc.Text())
	var firstdata *big.Int

	for i := 0; i < dataset*2; i++ {
		n := new(big.Int)
		sc.Scan()
		data, _ := n.SetString(sc.Text(), 10)

		if i%2 == 0 {
			firstdata = data
			continue
		}

		result := new(big.Int)
		if result := result.Add(data, firstdata); len(result.String()) > 80 {
			fmt.Println("overflow")
			continue
		} else {
			fmt.Println(result)
		}
	}
}

C++: #include <stdio.h>
#define MAX 80

int scanLI(int *n);
int addLI(int *a, int *b);
void printLI(int *n);

int main(void){
    int a[MAX],b[MAX];
    char buf[128];
    int n;
    bool of;
    
    scanf("%d", &n);
    for (int i=0; i<n; i++){
        for (int j=0; j<MAX; j++){
            a[j] = b[j] = 0;
        }
        of = false;
        if (scanLI(a) == -1) of = true;
        if (scanLI(b) == -1) of = true;
        if (addLI(a, b) == -1) of = true;
        if (!of){
            printLI(a);
            printf("\n");
        } else {
            printf("overflow\n");
        }
    }
    
    return 0;
}

int scanLI(int *n){
    char buf[128];
    int len;
    
    scanf("%s", buf);
    for (len=0; buf[len]!='\0'; len++);
    if (len>MAX){
        return -1;
    }
    for (int i=0; i<len; i++){
        n[i] = buf[len-i-1]-'0';
    }
    return 0;
}

int addLI(int *a, int *b){
    int c=0;
    
    for (int i=0; i<MAX; i++){
        a[i] += b[i]+c;
        c = a[i]/10;
        a[i] %= 10;
    }
    return c ? -1 : 0;
}

void printLI(int *n){
    bool zero=true;
    
    for (int i=MAX-1; i>=0; i--){
        if (n[i]==0){
            if (!zero) printf("0");
        } else{
            zero = false;
            printf("%d", n[i]);
        }
    }
}

C++: 

import java.util.Scanner;

public class Main {

	int SIZE = 80;
	int[] ans;

	void run() {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();

		for (int l = 0; l < n; l++) {
			// 80ケタの数字は扱えないので文字列に
			char[] a = sc.next().toCharArray();
			char[] b = sc.next().toCharArray();

			// 入力が80ケタを超える
			if (a.length > SIZE || b.length > SIZE) {
				System.out.println("overflow");
				continue;
			}

			// 文字列⇒配列に
			int[] x = new int[a.length];
			int[] y = new int[b.length];
			for (int i = 0; i < a.length; i++) {
				x[i] = a[i] - '0';
			}
			for (int i = 0; i < b.length; i++) {
				y[i] = b[i] - '0';
			}

			// 大きい桁数+1だけ答えの配列をとる
			if (x.length >= y.length) {
				ans = new int[x.length + 1];
			} else {
				ans = new int[y.length + 1];
			}

			int i = x.length - 1;
			int j = y.length - 1;
			int k = ans.length - 1;
			int count = 0;
			boolean flag = false;

			// 同じ桁数の計算
			while (i >= 0 && j >= 0) {
				count++;
				ans[k] += (x[i] + y[j]);
				// 繰り上がり処理
				if (ans[k] >= 10) {
					if (count < SIZE) {
						ans[k - 1] = 1;
						ans[k] -= 10;
					} else {
						flag = true;
					}
				}
				i--;
				j--;
				k--;
			}

			if (i > j) {
				while (i >= 0) {
					count++;
					ans[k] += x[i];
					// 繰り上がり処理
					if (ans[k] >= 10) {
						if (count < SIZE) {
							ans[k - 1] = 1;
							ans[k] -= 10;
						} else {
							flag = true;
						}
					}
					k--;
					i--;
				}
			} else {
				while (j >= 0) {
					count++;
					ans[k] += y[j];
					// 繰り上がり処理
					if (ans[k] >= 10) {
						if (count < SIZE) {
							ans[k - 1] = 1;
							ans[k] -= 10;
						} else {
							flag = true;
						}
					}
					k--;
					j--;
				}
			}

			if (flag) {
				System.out.println("overflow");
				continue;
			}

			for (int m = 0; m < ans.length; m++) {
				if (m == 0 && ans[m] == 0) {
					continue;
				}
				System.out.print(ans[m]);
			}
			System.out.println();
		}

		sc.close();
	}

	// void run1() {
	// Scanner sc = new Scanner(System.in);
	// int n = sc.nextInt();
	//
	// for (int k = 0; k < n; k++) {
	// // char[] a = new char[SIZE];
	// // char[] b = new char[SIZE];
	//
	// int[] x = new int[SIZE];
	// int[] y = new int[SIZE];
	// int[] ans = new int[SIZE];
	//
	// char[] a = sc.next().toCharArray();
	// char[] b = sc.next().toCharArray();
	//
	// if (a.length > 80 || b.length > 80) {
	// System.out.println("overflow");
	// continue;
	// }
	//
	// for (int i = 0; i < a.length; i++) {
	// x[i] = a[i] - '0';
	// }
	//
	// for (int i = 0; i < b.length; i++) {
	// y[i] = b[i] - '0';
	// }
	//
	// int i = a.length - 1;
	// int j = b.length - 1;
	// int l = 0;
	// boolean flag = true;
	//
	// while (i >= 0 || j >= 0) {
	// if (j < 0) {
	// while (i >= 0) {
	// ans[l] += x[i];
	// if (ans[l] >= 10) {
	// ans[l] -= 10;
	// if (l + 1 >= 80) {
	// flag = false;
	// break;
	// }
	// ans[l + 1] = 1;
	// }
	// l++;
	// i--;
	// }
	// break;
	// }
	//
	// if (i < 0) {
	// while (j >= 0) {
	// ans[l] += y[j];
	// if (ans[l] >= 10) {
	// ans[l] -= 10;
	// if (l + 1 >= 80) {
	// flag = false;
	// break;
	// }
	// ans[l + 1] = 1;
	// }
	// l++;
	// j--;
	// }
	// break;
	// }
	//
	// ans[l] += (x[i] + y[j]);
	// if (ans[l] >= 10) {
	// ans[l] -= 10;
	// if (l + 1 >= 80) {
	// flag = false;
	// break;
	// }
	// ans[l + 1] = 1;
	// }
	// l++;
	// i--;
	// j--;
	// }
	//
	// if (!flag) {
	// System.out.println("overflow");
	// }
	// else {
	// if (ans[l] == 1) {
	// l++;
	// }
	// for (int m = l - 1; m >= 0; m--) {
	// System.out.print(ans[m]);
	// }
	// System.out.println();
	// }
	//
	// }
	//
	// sc.close();
	// }

	public static void main(String[] args) {
		new Main().run();
	}

}

C++: #include <iostream>
#include <cstdio>
using namespace std;
int main(){
  int n;
  cin >> n;
  while(n--){

  string num1,num2;
  cin >> num1 >> num2;

  if(num1.size() < num2.size())swap(num1,num2);
  if(num1.size() > 80){
    cout << "overflow" << endl;
    continue;
  }
  int m = num1.size()-num2.size();
  int M = num1.size();
  string n1="",n2="";
  for(int i = 0 ; i < m ; i++ )n2+='0';
  n2 = n2 + num2;
  string nn1="",nn2="";
  for(int i = M-1 ; i >= 0 ; i-- ){
    nn1+=num1[i];
    nn2+=n2[i];
  }
  string ans="",ansi="";
  int t = 0;

  for(int i = 0 ; i < num1.size() ; i++ ){
    if(t + (nn1[i] - '0') + (nn2[i] - '0') >= 10){
      ans += (t + (nn1[i] - '0') + (nn2[i] - '0') - 10) + '0' ;
      t = 1;
    } else {
      ans += (char)(t + (nn1[i]-'0') + (nn2[i]-'0') + '0');
      t = 0;
    }
  }

    if(t==1)ans+='1';
    for(int i = ans.size()-1 ; i >= 0 ; i--){
      ansi += ans[i];
    }
    if(ansi.size() > 80){
      cout << "overflow" << endl;
    }else cout << ansi << endl;
    }
  return 0;
}

C++: #include <iostream>
#include <string>
#define MAX 80

using namespace std;

int main()
{
	int n;
	cin >> n;
	for (int counter = 0; counter < n; counter++){
		string a, b;
		cin >> a >> b;
		if (a.length() > MAX || b.length() > MAX){
			cout << "overflow" << endl;
			continue;
		}
		if (a.length() == 1 || b.length() == 1 && a[0] == 0 && b[0] == 0){
			cout << 0 << endl;
			continue;
		}
		int inta[MAX + 2], intb[MAX + 2], sum[MAX + 2];
		fill(inta, inta + MAX + 2, 0);
		fill(intb, intb + MAX + 2, 0);
		fill(sum, sum + MAX + 2, 0);
		for (int i = 0; i < (signed)a.length(); i++){
			inta[i] = a[a.length() - i - 1] - '0';
		}
		for (int i = 0; i < (signed)b.length(); i++){
			intb[i] = b[b.length() - i - 1] - '0';
		}

		int over = 0;
		for (int i = 0; i < MAX + 2; i++){
			sum[i] = inta[i] + intb[i] + over;
			if (sum[i] >= 10){
				sum[i] %= 10;
				over = 1;
			}
			else{
				over = 0;
			}
		}

		for (int i = MAX + 1;; i--){
			if (sum[i] != 0){
				if (i >= MAX){
					cout << "overflow" << endl;
					break;
				}
				for (int j = i; j >= 0; j--){
					cout << sum[j];
				}
				cout << endl;
				break;
			}
		}
	}
	return 0;
}