Add to Array-Form of Integer

Bowman

Aktif Üye
Katılım
7 Ekim 2022
Mesajlar
112
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.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,955
Mesajlar
118,794
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top