Go: package main

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

var scanner = bufio.NewScanner(os.Stdin)

func nextString() string {
	scanner.Scan()
	return scanner.Text()
}

func nextInt() int {
	n, err := strconv.Atoi(nextString())
	if err != nil {
		fmt.Printf("strconv.Atoi failed: %v\n", err)
	}
	return n
}

func main() {
	scanner.Split(bufio.ScanWords)

	const maxCapacity = 512 * 1024
	buf := make([]byte, maxCapacity)
	scanner.Buffer(buf, maxCapacity)

	n := nextInt()
	maxint, _ := new(big.Int).SetString("100000000000000000000000000000000000000000000000000000000000000000000000000000000", 10)

	for i := 0; i < n; i++ {
		aStr := nextString()
		bStr := nextString()

		a, _ := new(big.Int).SetString(aStr, 10)
		b, _ := new(big.Int).SetString(bStr, 10)
		c := big.NewInt(0).Add(a, b)

		if c.Cmp(maxint) < 0 {
			fmt.Println(c)
		} else {
			fmt.Println("overflow")
		}
	}
}

C++: #include <iostream>
#include <string>
using namespace std;
int main( void )
{
  int n;
  string s1,s2;
  int d1[82],d2[82],d3[82];
  cin >> n;
  for( int k=0; k<n; k++ ){
    cin >> s1 >> s2;
    if( s1.size() > 80 || s2.size() > 80 ){
      cout << "overflow" << endl;
      continue;
    }
    for( int i=0; i<s1.size(); i++ ) d1[i] = s1[s1.size()-i-1] - '0';
    for( int i=s1.size(); i<80; i++ ) d1[i] = 0;
    for( int i=0; i<s2.size(); i++ ) d2[i] = s2[s2.size()-i-1] - '0';
    for( int i=s2.size(); i<80; i++ ) d2[i] = 0;
    for( int i=0; i<=80; i++ ) d3[i] = 0;
    for( int i=0; i<80; i++ ){
      d3[i] += d1[i] + d2[i];
      if( d3[i] >= 10 ){ d3[i] %= 10; d3[i+1]++; }
    }
    int i=80;
    if( d3[i] > 0 ){
      cout << "overflow" << endl;
      continue;
    }
    while( d3[--i] == 0 )
      ;
    while( i >= 0 ) cout << d3[i--];
    cout << endl;
  }
  return 0;
}

C++: #include<cstdio>
#include<iostream>
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        char moneywrite[2][1000];
        int money[2][1000];
        int stl[2]={0,0};
        int stlstl;
        int sum[81];
        scanf("%s",moneywrite[0]);
        scanf("%s",moneywrite[1]);
        for(int j=0;moneywrite[0][j]!='\0';j++){
            money[0][j]=moneywrite[0][j]-'0';
            stl[0]++;
        }
        for(int j=0;moneywrite[1][j]!='\0';j++){
            money[1][j]=moneywrite[1][j]-'0';
            stl[1]++;
        }
        if(stl[0]>stl[1]){
            stlstl=stl[0];
            int p;
            p=stl[0]-stl[1];
            for(int j=0;j<stl[0];j++){
                money[1][stl[0]-j]=money[1][stl[0]-j-p];
            }
            for(int k=0;k<p;k++)
                money[1][k]=0;
        }
        else if(stl[1]>stl[0]){
            stlstl=stl[1];
            int p;
            p=stl[1]-stl[0];
            for(int j=0;j<stl[1];j++){
                money[0][stl[1]-j]=money[0][stl[1]-j-p];
            }
            for(int k=0;k<p;k++)
                money[0][k]=0;
        }
        else{
            stlstl=stl[1];
        }
/*
        for(int j=0;j<stlstl;j++)
            printf("[%d][%d]\n",money[0][j],money[1][j]);
*/
        if(80<=stlstl){
            printf("overflow");
            goto exit;
        }
        for(int j=stlstl-1;0<=j;j--){
            sum[j]=money[0][j]+money[1][j];
            if(10<=sum[j]){
                if(stlstl==79){
                    printf("overflow");
                    goto exit;
                }
                else if(j==0){
                    printf("1");
                    sum[j]%=10;
                }
                else{
                    money[0][j-1]++;
                    sum[j]%=10;
                }
            }
        }
        for(int j=0;j<stlstl;j++)
            printf("%d",sum[j]);
exit:
        puts("");
    }
    return 0;
}

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

	int n;
	cin >> n;
	while(n > 0){
        char a[100] = {0};
        char b[100] = {0};
        scanf("%s %s",a,b);
        char ans[100] = {0};
        for(int i = 0; i < strlen(a)/2; i++){
            swap(a[i],a[strlen(a)-i-1]);
        }
        for(int i = 0; i < strlen(b)/2; i++){
            swap(b[i],b[strlen(b)-i-1]);
        }
        int len = max(strlen(a),strlen(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;
            }
        }
        for(int i = 0; i < strlen(ans)/2; i++){
            swap(ans[i],ans[strlen(ans)-i-1]);
        }
        int Len_a = 0,Len_b = 0,Len_ans = 0;
        for(int i = 0; a[i] != 0; i++) Len_a++;
        for(int i = 0; b[i] != 0; i++) Len_b++;
        for(int i = 0; ans[i] != 0; i++) Len_ans++;
        if(Len_a > 80 || Len_b > 80 || Len_ans > 80) printf("overflow\n");
        else cout << ans << endl;
        n--;
	}

	return 0;
}

C++: #include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int main()
{
  int N;
  char str1[82];
  char str2[82];
  int j = 0, k = 0, c;
  cin >> N;
  for(int i = 0; i < N; i++){
    cin >> str1;
    cin >> str2;
    if(strlen(str1) > 80 || strlen(str2) > 80)
      cout << "overflow" << endl;
    else{
      int n1[42] = {};
      int n2[42] = {};
      int m1 = strlen(str1), m2 = strlen(str2);
      for(int i = 1, j = 41; (m1 - i - 1 >= 0) || (m1 - i >= 0); i += 2, j--)
	if(str1[m1 - i - 1] == '0')
	  if(str1[m1 - i] == '0')
	    n1[j] = 1000;
	  else 
	    n1[j] = str1[m1 - i] - '0';
	else
	  if(m1 - i - 1 < 0)
	    n1[j] = str1[m1 - i] - '0';
	  else
	    n1[j] = (str1[m1 - i] - '0') + (str1[m1 - i - 1] - '0') * 10; 
      for(int i = 1, j = 42; (m2 - i - 1 >= 0) || (m2 - i >= 0); i += 2, j--)
	if(str2[m2 - i - 1] == '0')
	  if(str2[m2 - i] == '0')
	    n2[j] = 1000;
	  else
	    n2[j] = (str2[m2 - i] - '0');
	else
	  if(m2 - i - 1 < 0)
	    n2[j] = str2[m2 - i] - '0';
	  else
	    n2[j] = (str2[m2 - i] - '0') + (str2[m2 - i - 1] - '0') * 10;
      int ans[41] = {};
      int i = 0;
      int m = (m1 > m2) ? m1 : m2;
      for(int j = 41; 40 - m / 2 < ((m % 2) ? j + 1 : j); i++, j--)
	if(n1[j] + n2[j] >= 100)
	  if(n1[j] == 1000 && n2[j] < 10){
	    n1[j - 1] *= 10;
	    ans[i] = n2[j];
	  }else if(n2[j] == 1000 && n1[j] < 10){
	    n2[j - 1] *= 10;
	    ans[i] = n1[j];
	  }else if(n1[j] == 1000 && n2[j] == 1000){
	    if(n1[j - 1] % 10 != 0)
	      n1[j - 1] *= 10;
	    ans[i] = 1000;
	  }else if(n1[j] == 1000 && n2[j] >= 10){
	    ans[i] = n2[j];
	  }else if(n2[j] == 1000 && n1[j] >= 10){
	    ans[i] = n1[j];
	  }else if(n1[j] + n2[j] < 110){
	    n1[j - 1]++;
	    ans[i] = n1[j] + n2[j] + 900;
	  }else{
	    n1[j - 1]++;
	    ans[i] = n1[j] + n2[j] - 100;
	  }
	else
	  ans[i] = n1[j] + n2[j];
      int k = i;
      for(; i > 0; i--)
	if((i == k) && (ans[i - 1] == 0))
	  ;
	else if(ans[i - 1] == 1000)
	  cout << "00";
	else if(ans[i - 1] > 1000)
	  cout << "0" << ans[i - 1] % 1000;
	else
	  cout << ans[i - 1];
      cout << endl;
    }
  }
}