C'de, işlem yapılabilecek en büyük basamaklı sayı C99 sürümü ile birlikte devreye giren 64 bit'lik unsigned long long int veri türünün alabileceği maksimum değer olan 20 basamaklı 18.446.744.073.709.551.615 sayısıdır. Bu sayıdan daha büyük sayılarda toplama işlemi yapmak için karakter dizilerini kullanabiliriz.
Aşağıdaki program, bg_add_str() fonksiyonunu kullanarak, karakter dizisi olarak geçirilen sayıları toplayarak karakter dizisi olarak elde bir sonuç elde eder. Fonksiyon, basamak bazında toplama işlemi yaparak sonucu elde eder.
#include <stdio.h>
#include <string.h>
char* bg_add_str(char *str1, char *str2, char *result);
char* bg_strrev(char *str);
int main(void)
{
char cdizi1[] = "2459052136951236584723219";
char cdizi2[] = "937459951326843257468";
char cret[100];
bg_add_str(cdizi1, cdizi2, cret);
printf("Toplama sonucu: %s", cret);
return 0;
}
char* bg_add_str(char *str1, char *str2, char *result)
{
int maxval, minval, toplam, elde=0;
int id, max=0;
// Dizi boyutlarını hesaplama
int len1 = strlen(str1);
int len2 = strlen(str2);
// Dizileri ters çevirme
bg_strrev(str1);
bg_strrev(str2);
if (len1>len2) {
maxval=len1;
minval=len2;
max = 1;
}
else if (len2>len1) {
maxval=len2;
minval=len1;
max = 2;
}
else {
minval = maxval = len1;
}
for (id=0; id<maxval; id++) {
if (id<minval) {
toplam = ((str1[id]-'0') + (str2[id]-'0') + elde);
}
else {
toplam = ((((max==1) ? str1[id]:str2[id])-'0') + elde);
}
result[id] = (toplam%10 + '0');
elde = toplam/10;
}
// Kalan elde değerini ekleme
if (elde) result[id++] = elde+'0';
result[id] = '\0';
// Sonuç dizisini ters çevirme
bg_strrev(result);
return result;
}
char* bg_strrev(char *str)
{
char *beg = str;
char *end = str+(strlen(str)-1);
char temp;
while(end>beg) {
temp = *beg;
*beg++ = *end;
*end-- = temp;
}
return str;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
Toplama sonucu: 2459989596902563427980687