Add to Array-Form of Integer

Bowman

Üye
Katılım
7 Ekim 2022
Mesajlar
98
Leetcode problemi çözmeye çalışıyorum. Soru benden şunu yapmamı istiyor. Öncelikle bir integer arrayi ve bir integer değer veriyor. Sonrasında arrayi integer formuna dönüştürüp diğer integer değerle toplamalıyım. En sonda çıkan değeri ise tekrar integer array formuna çevirmeliyim.

Şu şekilde bir örnekle anlatırsam daha kolay olacak;
  • Inputlardan biri num arrayi olsun. int num[] = {1,2,3,4};
  • Diğer input ise a = 30 olsun.
Öncelike num arrayini num[] = {1,2,3,4}'ten 1234 haline çevirmeliyim. Sonrasında 1234 + 30 = 1264 değerini bulmalıyım. En sonda ise 1264 sayısını num[] = {1,2,6,4} şeklinde tekrar bir arraya çevirmeliyim.

Ben şöyle bir adım izledim;
  1. Verilen arrayi integer sayıya çevir
  2. Bulduğun sayının basamak sayısını hesapla
  3. For'un içinde bulduğun basamak sayısı kadar dönerek sayıyı tekrar arraya çevir
Şimdi şöyle problemlerle karşılaşıyorum. Öncelikle integer sınırını aşan değerler benim başımı ağrıtıyor. Ve heap-buffer-overflow hatası alıyorum. Kodumda sizce nere yanlış? Yoksa direkt kurduğum algoritma mı hatalı?

Kodum şu şekilde:

C:
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* addToArrayForm(int* num, int numSize, int k, int* returnSize)
{
    long long sum = 0,sumCopy;
    int digit = 0;

    for(int i = 0; i < numSize; i++)
    {
        sum = sum * 10 + num[i];
    }

    sum += k;
    sumCopy = sum;
    
    while(sumCopy > 0)
    {
        sumCopy /= 10;
        digit++;
    }
    
    *returnSize = digit;
    int* returnValue = (int*)malloc(digit*sizeof(int));

    for(int j = digit; j > 0; j--)
    {
        returnValue[j] = sum % 10;
        sum /= 10;
    }
    
    return returnValue;
}
 
Üç ayrı fonksiyon yaz:

1) Bir integer'i array forma dönüştüren
2) Bir array forma başka bir array formu ekleyen
3) Array formu integer'a dönüştüren.

Sonra da ana fonksiyonda bunları çağır.
 
Biraz ara vermem gerekti ama problemi çözmeye kaldığım yerden devam ediyorum :)

Üç ayrı fonksiyon yaz:

1) Bir integer'i array forma dönüştüren
2) Bir array forma başka bir array formu ekleyen
3) Array formu integer'a dönüştüren.

Sonra da ana fonksiyonda bunları çağır.
Dediğiniz gibi 3 farklı fonksiyon yazarak çözüme ulaşmaya çalıştım. Kodumun son hali şu şekilde.

C:
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int convert_arr_to_int(int arr[],int size)
{
    int i,result=0;

    for(i = 0; i < size; i++)
    {
        result = result * 10 + arr[i];
    }

    return result;
}

int add_arr_to_num(int arr[],int size,int k)
{
    int result;

    result = convert_arr_to_int(arr,size);

    result += k;

    return result;
}

int digit_count(int num)
{
    if (num == 0)
    {
        return 1;
    }
    int count = 0;
    while (num != 0)
    {
        count++;
        num /= 10;
    }
    return count;
}

void reverse_array(int arr[], int length)
{
    int i, j, temp;

    for (i = 0, j = length - 1; i < j; i++, j--) {
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

int* convert_int_to_arr(int arr[],int size,int num)
{
    int i;

    for(i = 0; i < size; i++)
    {
        arr[i] = num % 10;
        num /= 10;
    }

    reverse_array(arr,size);

    return arr;
}

int* addToArrayForm(int* num, int numSize, int k, int* returnSize)
{
    int result = 0;

    result = convert_arr_to_int(num,numSize);

    result = add_arr_to_num(num,numSize,k);

    *returnSize = digit_count(result);
    int* returnArr = (int*)malloc(*returnSize * sizeof(int));

    convert_int_to_arr(returnArr,returnSize,result);

    return returnArr;
}

Aldığım hata ise şu.

Kod:
=================================================================
==32==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000040 at pc 0x561b22be0093 bp 0x7ffd46956c80 sp 0x7ffd46956c70
WRITE of size 4 at 0x602000000040 thread T0
    #3 0x7f272e0890b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
0x602000000040 is located 0 bytes to the right of 16-byte region [0x602000000030,0x602000000040)
allocated by thread T0 here:
    #0 0x7f272eccebc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8)
    #3 0x7f272e0890b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
Shadow bytes around the buggy address:
  0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa 00 00 fa fa 00 00[fa]fa fa fa fa fa fa fa
  0x0c047fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==32==ABORTING

buffer overflow olması heralde bir yerlerde arrayin boyutu ile alakalı bir hatamı yapıyorum düşüncesi oluşturdu bende. Fakat uzun süredir hatamı aramama rağmen malesef bulamadım hatanın nerede olduğunu.
 
Mevcut kodun neden çakıldığına bakmadan önce, algoritmada bir hata var. k yi array'e dönüştürüp, toplamayı array olarak yapman gerekiyordu. Ama sen önce array'i int yapıyorsun. Bu şekilde soruda isteneni belli şartlar altında yapmamış oluyorsun. Nedir o şartlar? num'da tutulan sayı 264 ve daha fazla ise (Bilgisayarın 64 bit olduğunu varsayarsak).

Yapman gereken, önce k yi array haline getireceksin (bir fonksiyon). Sonra bu array ile num toplanacak (başka bir fonksiyon) ve sonuç döndürülecek.

Sadece fonksiyonları yazma, Bunu test eden programın tamamını yaz ki ben de burada deneyebileyim.
 

Forum istatistikleri

Konular
5,815
Mesajlar
99,265
Üyeler
2,476
Son üye
mrmandos

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top