Go: package main

import (
        "fmt"
        "bufio"
        "os"
)

func main() {
        var n int
        var a, b string
        sc := bufio.NewScanner(os.Stdin)
        fmt.Scanf("%d", &n)
        for i := 0; i < n; i++ {
                sc.Scan()
                a = sc.Text()
                sc.Scan()
                b = sc.Text()

                if len(a) > len(b) {
                        s := add(a, b)
                        if s[len(a)] > 0 {
                                if len(a) >= 80 {
                                        fmt.Printf("overflow")
                                } else {
                                        for i := 0; i <= len(a);i++ {
                                                fmt.Printf("%d", s[len(a)-i])
                                        }
                                }
                                fmt.Printf("\n")
                        } else {
                                if len(a)-1 >= 80 {
                                        fmt.Printf("overflow")
                                } else {
                                        for i := 0; i < len(a);i++ {
                                                fmt.Printf("%d", s[len(a)-i-1])
                                        }
                                }
                                fmt.Printf("\n")
                        }
                } else {
                        s := add(b, a)
                        if s[len(b)] > 0 {
                                if len(b) >= 80 {
                                        fmt.Printf("overflow")
                                } else {
                                        for i := 0; i <= len(b);i++ {
                                                fmt.Printf("%d", s[len(b)-i])
                                        }
                                }
                                fmt.Printf("\n")
                        } else {
                                if len(b)-1 >= 80 {
                                        fmt.Printf("overflow")
                                } else {
                                        for i := 0; i < len(b);i++ {
                                                fmt.Printf("%d", s[len(b)-i-1])
                                        }
                                }
                                fmt.Printf("\n")
                        }
                }
        }
}

// expects ln > lm
func add(n string, m string) (s [100]int) {
        ln := len(n)
        lm := len(m)
        var sum [100]int

        for i := 0; i < ln; i++ {
                var s, t int
                s = int(n[ln-1-i]) - int('0')

                if lm - 1 - i >= 0 {
                        t = int(m[lm-1-i]) - int('0')
                } else {
                        t = 0
                }

                sum[i+1] = (s + t + sum[i]) / 10
                sum[i] = (s + t + sum[i]) % 10
        }

        return sum
}

C++: #include<cstdio>

int main(){
	int a[82] = {};
	int b[82] = {};
	int c[82] = {};
	int n;
	int k,l,m,f;
	char t;
	int of;

	scanf("%d\n", &n);


	for(int i = 0; i < n; i++){
		of = k = l = 0;
		scanf("%c", &t);
		while(t - 10){
			k++;
			a[k] = t - '0';
			scanf("%c", &t);
			if(k == 81){
				of = 1;
				while(t - 10){
					scanf("%c", &t);
				}
			}
		}
		scanf("%c", &t); 

		while(t - 10){
			l++;
			b[l] = t - '0';
			scanf("%c", &t);
			if(l == 81){
				of = 1;
				while(t - 10){
					scanf("%c", &t);
				}
			}

		}

		m = 0;
		f = 0;

		while(k - m){
			c[m] = a[k - m];
			m++;
		}
		m = 0;
		while(l - m){
			c[m] += b[l - m ] + f;
			f = 0;
			if(c[m] > 9){
				c[m] -= 10;
				f = 1;
			}
			m++;
		}

		while(f){
			c[m] += 1;
			f = 0;
			if(c[m] > 9){
				c[m] -= 10;
				f = 1;
			}
			m++;
		}

		if(k > m){
			m = k;
		}

		for(int i = 0; i < m; i++){
			if(m == 81 || of){
				printf("overflow");
				i = m;
			}else{
				printf("%d", c[m - i - 1]);
			}
		}
		printf("\n");
	}
	return 0;
}

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

inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

template<class T> inline T sqr(T x) {return x*x;}

typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef long long LL;
typedef unsigned long long ULL;

#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

const double EPS = 1e-10;
const double PI  = acos(-1.0);

#define CLR(a) memset((a), 0 ,sizeof(a))

#define dump(x)  cerr << #x << " = " << (x) << endl;
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};

int main() {
  int n;
  cin >> n;

  REP(i, n) {
    char s1[100], s2[100], ans[100];
    cin >> s1 >> s2;
    int len1 = strlen(s1)-1, len2 = strlen(s2)-1;
    if(len1 > 80 || len2 > 80) {
      cout << "overflow" << endl;
      continue;
    }

    int c = 0;
    int cnt = 0, j = len1, k = len2;
    while(j >= 0 || k >= 0 || c) {
      char s = c;
      if(j >= 0) s += s1[j] - '0';
      if(k >= 0) s += s2[k] - '0';
      if(s > 9) {
	s -= 10;
	c = 1;
      }
      else 
	c = 0;

      s += '0';

      ans[cnt] = s;
      cnt++, j--, k--;
    }

    int len = strlen(ans);
    if(len > 80) 
      cout << "overflow" << endl;
    else {
      for(j = len - 1; j >= 0; j--) {
	cout << ans[j];
      }
      cout << endl;
    }
  }
}

C++: /**
 *  http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0015
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_DIGITS 80
#define MAX_INPUTS 101

char           *add(const char *n1, const char *n2);
char           *overflowmsg();
char           *stralloc(const size_t length);

int
main(int argc, char *argv[])
{
    int             n, i;
    char            n1[MAX_INPUTS];
    char            n2[MAX_INPUTS];
    char           *r;

    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%s", n1);
        scanf("%s", n2);
        r = add(n1, n2);

        printf("%s\n", r);

        free(r);
    }

    return 0;
}

char           *
add(const char *n1, const char *n2)
{
    int             l1, l2, lr;
    int             c = 0;
    int             d;
    int             i = 0;
    char           *r;
    char           *n;

    l1 = strlen(n1);
    l2 = strlen(n2);
    if (l1 > MAX_DIGITS || l2 > MAX_DIGITS) {
        return overflowmsg();
    }
    lr = l1 > l2 ? l1 : l2;

    r = stralloc(lr + 1);
    while (lr >= 0) {
        d = c + (l1-- > 0 ? n1[l1] - '0' : 0) + (l2-- > 0 ? n2[l2] - '0' : 0);
        c = d / 10;
        r[lr--] = d % 10 + '0';
    }
    while (r[i] == '0') {
        i++;
    }
    if (strlen(r + i) > MAX_DIGITS) {
        free(r);
        return overflowmsg();
    }
    if (i != 0) {
        n = r;
        r = stralloc(strlen(n + i));
        strcpy(r, n + i);
        free(n);
    }
    return r;
}

char           *
overflowmsg()
{
    const char     *e = "overflow";
    char           *r;
    r = stralloc(strlen(e));
    strcpy(r, e);
    return r;
}

char           *
stralloc(const size_t length)
{
    char           *r;
    r = (char *)calloc(length + 1, sizeof(char));
    return r;
}