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 <iostream>
#include <sstream>
#include <cstring>

using namespace std;

int main()
{
	stringstream ss;
	string str;
	int n;
	long num;
	
	cin >> n;
	while (n != 0){
		int sum = 0;
		for (int i = 0; i < 2; i++){
			cin >> str;
			ss.clear();
			ss.str("");
			ss << str;
			ss >> num;
			sum += num;
		}
		ss.clear();
		ss.str("");
		ss << sum;
		ss >> str;
		
		if (str.size() > 80){
				cout << "overflow" << endl;
				break;
		}
		else{
			cout << str << endl;
		}
		n--;
	}
	return (0);
}

C++: #include <iostream>
#include <cstring>

int main(void){
	int n;
	std::cin >> n;
	char i1[81]="",i2[81]="",res[81]="";
	for(int i=0; i<n; i++){
		bool cflag=false;
		std::cin >> i1;
		std::cin >> i2;
		for(int j=0;j<80;j++){
			char c='0';
			if(cflag)
				c+=1;
			cflag=false;
			if(strlen(i1)>j){
				c+=i1[strlen(i1)-j-1]-'0';
			}
			if(strlen(i2)>j){
				c+=i2[strlen(i2)-j-1]-'0';
			}
			if(c > '9'){
				cflag=true;
				c-=10;
			}
			res[79-j]=c;
		}

		if(cflag){
			std::cout << "overflow" << std::endl;
		}else{
			char *p = res;
			while(*p++ == '0');
			std::cout << (p-1) << std::endl;
		}
	}
	return 0;
}

C++: #include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <stack>
#include <set>
#include <cmath>
#include <algorithm>
#include <numeric>
using namespace std;

int stoi(char c){
	return c-'0';
}

char itos(int a){
	return a+'0';
}

int main(){
	int n;
	string s1,s2,ans;
	int lmin , lmax , sum , tmp , tmp2;
	bool bs1=true;
	cin >> n;
	for(int i=0; i<n ; ++i){
		cin >> s1 >> s2;
		reverse(s1.begin(),s1.end());
		reverse(s2.begin(),s2.end());
		lmin=min(s1.length(),s2.length());
		lmax=max(s1.length(),s2.length());
		if(s1.length()<s2.length()) bs1=false;
		for(int j=0;j<lmin;++j){
			ans.resize(j+2 , '0');
			sum=stoi(s1[j])+stoi(s2[j]);
			if(sum>=10){
				ans[j+1]=itos(1);
				tmp=stoi(ans[j]);
				tmp+=sum%10;
				ans[j]=itos(tmp);
			} else {
				int tmp=stoi(ans[j]);
				tmp+=sum;
				if(tmp>=10){
					ans[j+1]=itos(1);
					tmp2=stoi(ans[j]);
					tmp2=tmp%10;
					ans[j]=itos(tmp2);
				} else {
					ans[j]=itos(tmp);
				}
			}
			
		}
		for(int k=lmin; k<lmax ; ++k){
			ans.resize(k+2, '0');
			if(bs1){
				sum=stoi(ans[k])+stoi(s1[k]);
				if(sum>=10){
				ans[k+1]=itos(1); 
				tmp=sum%10;
				ans[k]=itos(tmp);
				} else {
					ans[k]=itos(sum);
				}
			} else {
				sum=stoi(s2[k]);
				sum+=stoi(ans[k]);
				if(sum>=10){
				ans[k+1]=itos(1);
				tmp=sum%10;
				ans[k]=itos(tmp);
				} else {
				ans[k]=itos(sum);
				}
			}
		}
		reverse(ans.begin(),ans.end());
		if(ans[0]=='0') ans.erase(0,1);
		if(ans.length()>80|| s1.length()>80 || s2.length()>80) {cout << "overflow" << endl; ans.erase();}
		else {
			cout << ans << endl;
			ans.erase();
		}
	}
	return 0; 
}

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

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        string s1, s2, ans = "";
        cin >> s1 >> s2;
        int len1 = s1.length() - 1;
        int len2 = s2.length() - 1;
        int mlen = max(len1, len2);
        int pre = 0;
        for (int i = 0; i <= mlen; i++) {
            int sum = pre;
            sum += (len1 >= 0) ? s1[len1--] - '0' : 0;
            sum += (len2 >= 0) ? s2[len2--] - '0' : 0;
            pre = sum / 10;
            sum -= pre * 10;
            ans += '0' + sum;
        }
        if (pre > 0) ans += '0' + pre;
        reverse(ans.begin(), ans.end());
        if (ans.length() > 80) {
            puts("overflow");
        }
        else {
            cout << ans << endl;
        }
    }
    return 0;
}

C++: #include <cmath>
#include <cstdlib>
#include <cstdio>

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>



int main() {

  std::string a, b;
  long x[100] = {};
  long y[100] = {};
  long N;
  long temp;
  long len;

  std::cin >> N;
  for(int i = 0; i < N; ++i) {
    std::cin >> a >> b;
    for(int j = 0; j < 100; ++j) {
      x[j] = y[j] = 0;
    }
    for(int j = 0; j < a.size(); ++j) x[j] = a[ a.size()-j-1 ] - '0';
    for(int j = 0; j < b.size(); ++j) y[j] = b[ b.size()-j-1 ] - '0';

    temp = 0;
    for(int j = 0; j < 100; ++j) {
      temp = x[j] + y[j] + temp;
      x[j] = (temp % 10);
      temp /= 10;
    }

    len = std::max(a.size(), b.size());
    if( x[len] != 0 ) {
      if( len <= 80 ) { 
	std::cout << "overflow" << std::endl;
	continue;
      }
      for(int j = len; j >= 0; --j) {
	std::cout << x[j];
      }
      std::cout << std::endl;
      continue;
    }
    for(int j = len-1; j >= 0; --j) {
      std::cout << x[j];
    }
    std::cout << std::endl;
  }
    
  return 0;
}

C++: #include<iostream>
#include<string>
//ðÇÁ·é
void addplace(unsigned int *a, unsigned int *last, int num){
	if( a == last ) return; //[·¬ÜÛÀ
	
	int carry = (*a * 10 + num) / 100000000;
	addplace(a+1, last, carry);
	*a = (*a * 10 + num) % 100000000;
}
bool trace(unsigned int *a, unsigned int *last){
	if( a == last ) return false; //[·¬ÜÛÀ
	if( !trace(a+1, last) ){
		if( *a > 0 ){
			std::cout << *a;
			return true;
		}
	}else{
		char b[11]={};
		sprintf(b,"%d",*a+100000000);
		std::cout<<b+1;
		return true;
	}
	return false;
}
void add(unsigned int *a, unsigned int *alast, unsigned int *b, int num=0){
	if( a == alast ) return; //[·¬ÜÛÀ
	
	int carry = (*a + *b + num) / 100000000;
	add(a+1, alast, b+1, carry);
	*a = (*a + *b + num) % 100000000;
}
int main(){
	int n;
	std::cin>>n;
	std::string a,b;
	std::getline(std::cin, a);//üsÇÝÌÄ
	for(;n--;){
		std::getline(std::cin, a);
		std::getline(std::cin, b);
		//uint ½è1 0000 0000-1ÜÅJEg·é
		unsigned int _a[11]={},_b[11]={};
		int pcnt = 0;
		for(std::string::iterator it=a.begin();
			it!=a.end(); it++){
			if(++pcnt>80){
				std::cout<<"overflow\n";
				goto cnti;
			}
			addplace(_a, _a+10, *it-'0');
		}
		pcnt=0;
		for(std::string::iterator it=b.begin();
			it!=b.end(); it++){
			if(++pcnt>80){
				std::cout<<"overflow\n";
				goto cnti;
			}
			addplace(_b, _b+10, *it-'0');
		}
		add(_a, _a+11, _b);
		if( _a[10] >= 1 ){
			std::cout<<"overflow\n";
		}else{
			if(!trace(_a, _a+10))
				std::cout<<'0';
			std::cout<<'\n';
		}
cnti:;
	}
}

C++: #include <bits/stdc++.h>
using namespace std;

string add(string a, string b) {
	int al = a.size(), bl = b.size();
	reverse(a.begin(), a.end());
	reverse(b.begin(), b.end());
	string res;
	int tmp = 0;
	for (int i = 0; i < al || i < bl || tmp; i++) {
		tmp += (i < al ? a[i] - '0' : 0) + (i < bl ? b[i] - '0' : 0);
		res.push_back('0' + tmp % 10);
		tmp /= 10;
	}
	reverse(res.begin(), res.end());
	return res;
}

int main()
{
	int N;
	string a, b;
	cin >> N;
	while (N--) {
		cin >> a >> b;
		string sum = add(a, b);
		cout << (sum.size() > 80 ? string("overflow") : sum) << endl;
	}
	return 0;
}