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 <stdio.h>
#include <string.h>

int main(void)
{
	char str[2][1000];
	int b, s;
	int len[2];
	int i, j;
	int n;
	int flag;
	
	scanf("%d", &n);
	
	while (n){
		for (i = 0; i < 1000; i++){
			str[0][i] = str[1][i] = 0;
		}
		s = 1;
		b = 0;
		for (i = 0; i < 2; i++){
			scanf("%s", str[i]);
			len[i] = strlen(str[i]);
		}
		
		
		else {
			if (len[0] > 80 || len[1] > 80){
				printf("overflow\n");
				break;
			}
			if (len[0] < len[1]){
				s = 0;
				b = 1;
			}
			
			for (i = len[b], j = len[s]; i >= 0; i--, j--){
				if (j >= 0){
					str[s][i] = str[s][j];
				}
				else {
					str[s][i] = '0';
				}
			}
			
			flag = 0;
			i = len[b];
			while (i >= 0){
				if (str[s][i] + str[b][i] - '0' + flag > '9'){
					flag = 1;
				}
				else {
					flag = 0;
				}
				i--;
			}
			
			if (flag){
				for (i = len[b]; i >= 0; i--){
					for (j = 0; j < 2; j++){
						str[j][i + 1] = str[j][i];
					}
				}
				str[0][0] = '0';
				str[1][0] = '0';
			}
			
			for (i = len[b]; j >= 0; i--){
				str[b][i] += (str[s][i] - '0');
				if (str[b][i] > '9'){
					str[b][i] -= 10;
					str[b][i - 1]++;
				}
			}
			str[b][len[b] + flag] = '\0';
			
			printf("%s\n", str[b]);
		}
		
		n--;
	}
	
	return (0);
}

C++: #include<iostream>
#include<vector>
#include<string>

using namespace std ;

class Bigint {
	vector<int> digit ;//一桁ずつ格納する
	
public:
	Bigint(){}
	Bigint(string) ;
	Bigint operator + (Bigint &) ;
	friend ostream& operator << (ostream& os, const Bigint& obj) ;
};

Bigint::Bigint(string str)
{
	for(string::iterator it = str.begin() ;
		it != str.end() ;
		it++){
		this->digit.push_back(*it - '0');//一桁ごとに切り分ける
	}
}
Bigint Bigint::operator + (Bigint &obj)
{
	Bigint *domina ;//dominant
	Bigint *depend ;//dependent
	
	if(this->digit.size() >= obj.digit.size()){
		domina = this ;//大きい方が支配的である
		depend = &obj ;
	}else{
		domina = &obj ;
		depend = this ;
	}
	
	int diff = domina->digit.size() - depend->digit.size() ;
	for(int i=0 ; i < diff ; i++){//zero fill (zero padding)
		depend->digit.insert(depend->digit.begin(),0) ;// .unshift(0)　前から詰めるのがunshiftである。しかし、c++は融通も気も効かないので、perlなどで見られるunshiftなる命令があるわけが無く、わざわざ面倒な長い書き方をして、unshiftの代理とせねばならない。しかも、c++11でも無い限りは、back()もfront()も使えない。通常のc++では様々な語が使えないので、ストレスは極限まで上昇する。vectorとstringでこれらの便利極まりない用語が使えないので、c++での文字列操作はperlよりも数段階も悪化した劣悪な環境に置かれている。splitすらも無いというギリギリの状況で、プログラマは一体何をすればいいのか。全く以て深い霧に覆われている。
	}
	
	Bigint temp ;
	int carry = 0 ;
	for(vector<int>::reverse_iterator it = domina->digit.rbegin(),
		jt = depend->digit.rbegin() ;
		it != domina->digit.rend() ;
		it++, jt++){// reverseであることに注意
		int sum = *it + *jt + carry ;
		if(sum >= 10){
			carry = sum/10 ;
			sum = sum%10 ;
		}else{
			carry = 0 ;
		}
		temp.digit.insert(temp.digit.begin(),sum) ;// unshift
	}
	if(carry > 0){
		temp.digit.insert(temp.digit.begin(),carry) ;// unshift
	}
	
	return temp ;
}
ostream& operator << (ostream& os, const Bigint& obj)
{
	if(obj.digit.size() > 80){
		os << "overflow" ;
		return os ;
	}
	
	for(typeof(obj.digit.begin()) it = obj.digit.begin() ;
		it != obj.digit.end() ;
		it++){
		os << *it ;
	}
	
	return os ;
}
int main(void)
{
	int N;
	string str_a, str_b;
	
	cin >> N;
	
	for (int i = 0; i < N; i++){
		cin >> str_a >> str_b ;
		Bigint a(str_a), b(str_b);
		cout << a+b << endl ;
	}
}

C++: #include <stdio.h>
#include <stdlib.h>

int strlen(char * str, int len) {
	int i=0;
	while(1) {
		if (str[i]=='\0') {
			return i;
		}
		if (len==i) break;
		i++;
	}
	return len;
}

int main() {
	char *a,*b,*c;
	int n,len ,lena ,lenb , i, j, p, q, r1, r2, or1;
	scanf("%d",&n);
	// the definition of a , b , c
	a = (char *)malloc( 81 * n);
	b = (char *)malloc( 81 * n);
	c = (char *)malloc( 82 * n +2);
	for(i=0;i<n;i++) {
		scanf("%s",&a[i*81]);
		scanf("%s",&b[i*81]);
	}
	for(j=0;j<n;j++) {
		lena = strlen((char *)(&a[0] + j*81),81)-1;
		lenb = strlen((char *)(&b[0] + j*81),81)-1;
		if ( lena>lenb ) len = lena;
		else len = lenb;
		
		c[j*82+len+1]='\0';
		or1 = 0;
		r1 = r2 = 0;
		for(i=0;i<=len;i++) {
			// '0' is 48.

			if ((lena-i)>=0) p = a[j*81+lena-i] - '0';
			else p = 0;

			if ((lenb-i)>=0) q = b[j*81+lenb-i] - '0';
			else q = 0;

			or1 = r1;
			// Quotient
			if ((p+q+or1)>=10) r1 = 1;
			else r1 = 0;

			r2 = (p+q+or1)%10; // Remainder
			c[j*82+len-i] = '0' + r2;
		}
		if (r1>0) {
			c[j*82+len+2]='\0';
			for(i=0;i<=len;i++) {
				c[j*82+len+1-i] = c[j*82+len-i];
			}
			c[j*82] = r1 + '0';
			len++;
		}
		if (len>80){
			printf("Overflow\n");
		}else {
			printf("%s\n",&c[j*82]);
		}
	}
	free(a);
	free(b);
	free(c);
	exit(0);
}