Aşağıdaki metot parçası int, long, decimal gibi veri türlerinin alabileceğinden daha büyük sayıları toplama işlemine tabi tuta bilmek için yazılmıştır. Metot, iki adet sadece sayısal karakterleri içeren stringler'i parametre olarak alabilmekte ve aldığı parametreleri toplayarak karakter karakter toplayıp geriye toplam sonucunu string türünde geriye döndürmektedir.
Türden bağımsız(Lisp vb..) dillerde bu tür büyük sayılarda yapılacak işlemler sorun teşkil etmezken C, C++, C#, Java vb.. dillerde türlerin alabileceklerinden büyük sayılarda işlem yapmak zordur. Ayrıca C#'ta büyük sayılarda işlemler yapabilmek için yazılmış hazır kütüphaneler de var galiba.
Bu metot kendisine gelen sayısal değer taşıyan iki string'i eğer sayısal değer taşıyan stringler'in uzunlukları eşit değilse uzun olan stringin uzunluk değerine kısa olan string ulaşana kadar kısa olan string'in başına "0" eklenir, eğer stringlerin uzunlukları eşit ise başa "0" ekleme işlemi yapılmaz. Bu işlemin yapılmasının nedeni: Bu stringler sayısal karakterler taşıdıkları(yani bir sayı tutmaktadırlar) ve iki string'in son karakterlerinden ilk karakterlerine kadar birbirlerinin birler basamağının karakterlerinden itibaren aynı basamak ağırlıklarına sahip karakterlerini bir birleriyle toplayabilmek için yapılmaktadır ki toplama işlemi sonucu doğru olabilsin. Daha sonra sayısal veri tutan string'lerin uzunlukları aynı olduğu için herhangi bir(parametre olarak gelen string'lerden her hangi biri) string'in uzunluğu kadar bir for döngüsü döndürülür ve her basamak kendi arasında toplanır ve sonuç adım adım 'sonuc' isimli bir değişkende biriktirilir, stringler'in her basamak değeri char tipinde olduğundan tür dönüşümü ile ilk önce string'e sonra byte türüne dönüştürülüyor. 'araToplam' isimli byte türündeki değişkende aynı basamak değerlerinin toplamlarını tutmak için kullanılmaktadır 'araToplam' değeri 10 ve üzerinde ise bir üst basamağa elde verileceğinden 'elde' değişkeni 1 yapılır, bu işlem de her basamak değeri için ayrı yarı yapılır. En son basamak değerindeki toplama işleminde elde oluşursa eğer toplama sonucunun basamak sayısı iki sayının basamak sayısından 1 fazla olacağı anlamına gelmekte olduğundan, bu son elde eğer oluşuyorsa for dışında 'sonuc' değişkenine eklenir
using CV = System.Convert; // 'Convert' Sınıfı için takma isim kullanıldı. CV olan yerler Convert kullanılmış
// gibidir.
// Dinamik toplama metodu. Dışarıdan erişime kapalıdır.
public static string dinamikTopla(string sayi1,string sayi2)
{
byte elde = 0; // Toplamada oluşacak eldelleri tutmak için kullanılan değişken.
uint buyunSayi = 0; // Sadece pozitif sayılarda işlem düşünüldüğü için uint türü kullanıldı.
uint kucukSayi = 0; // Sadece pozitif sayılarda işlem düşünüldüğü için uint türü kullanıldı.
string sonuc = "";
// Bu if - else yapısında iki sayının toplamasının yapılabilmesi için iki sayı da aynı uzunluğa '0'
// eklenerek getiriliyor.
if (sayi1.Length >= sayi2.Length)
{
buyunSayi = (uint)sayi1.Length;
kucukSayi = (uint)sayi2.Length;
for (int i = 0; i < buyunSayi - kucukSayi; i++)
{
sayi2 = "0" + sayi2;
}
}
else
{
buyunSayi = (uint)sayi2.Length;
kucukSayi = (uint)sayi1.Length;
for (int i = 0; i < buyunSayi - kucukSayi; i++)
{
sayi1 = "0" + sayi1;
}
}
// Aynı uzunluktaki iki sayının toplaması yapılıyor.
for (int i = sayi1.Length -1; i >= 0; i--)
{
byte araToplam = (byte)(CV.ToByte(sayi1[i].ToString()) + CV.ToSByte(sayi2[i].ToString())+elde);
if (araToplam >= 10)
{
sonuc = CV.ToString(araToplam % 10) + sonuc;
elde = 1;
}
else
{
sonuc = CV.ToString(araToplam % 10) + sonuc;
elde = 0;
}
}
// Elde kalıyorsa son basamakta biz o eldeyi for döngüsünün dışında ekliyoruz.
if (elde != 0)
{
sonuc = elde.ToString() + sonuc;
}
return sonuc;
}
Kaydol:
Kayıt Yorumları (Atom)
0 yorum