Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
C Programlama

BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C örnek kodlar > c_ornek00050

C örnek kodlar

Büyük sayıları karakter dizileri kullanarak basamak olarak toplama işlemi

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