• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z zadaniem na LeetCode.

Object Storage Arubacloud
0 głosów
333 wizyt
pytanie zadane 17 lutego 2022 w C i C++ przez tonn204 Mądrala (7,440 p.)

Witam ,mam takie kod jak poniżej do zadania "Add Two Numbers" ze strony LeetCode i moje rozwiązanie nie jest zakceptowane. Dostaję taki komunikat jak poniżej. O co z tym chodzi i jak się pozbyć tego błędu?

Line 1061: Char 9: runtime error: addition of unsigned offset to 0x7fffbd5c55f0 overflowed to 0x7fffbd5c55ef (basic_string.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/basic_string.h:1070:9

 

Kod:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
#include <string>
#include <sstream>

class Solution {
public:
    void push(ListNode** head_ref, signed long new_data)
    {
        
        ListNode* new_node = new ListNode();
        
        new_node->next = NULL;
        new_node->val = new_data;
        
        if(*head_ref == NULL)
        {
            *head_ref = new_node;
            return;
        }
        
        ListNode* curr = *head_ref;
        while(curr->next != NULL){
            curr = curr->next;
        }
        curr->next = new_node;
    }
    
    void reverseStr(string& str)
    {
        int n = str.length();

        for (int i = 0; i < n / 2; i++)
            swap(str[i], str[n - i - 1]);
    }
    
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        std::string n1, n2;
        signed long a = 0, b = 0;
        
        while (l1 != nullptr)
        {
            n1 += std::to_string(l1->val);
            l1 = l1->next;
        }
        
        while (l2 != nullptr)
        {
            n2 += std::to_string(l2->val);
            l2 = l2->next;
        }
        
        reverseStr(n1);
        reverseStr(n2);
        
        std::stringstream ss1;
        ss1 << n1;
        ss1>> a;
        
        std::stringstream ss2;
        ss2 << n2;
        ss2 >> b;
        
        auto z = a + b;
        std::string answer = std::to_string(z);
        
        ListNode* root = NULL;
        
        for(auto i = answer.length()-1; i >= 0; i--)
        {
            char t =  answer[i];
            signed long  temp = t - '0';
            push(&root, temp);
        }
                
        return root;
    }
};

 

1 odpowiedź

0 głosów
odpowiedź 17 lutego 2022 przez j23 Mędrzec (194,920 p.)

Zgaduje, że problem jest tu:

for(auto i = answer.length()-1; i >= 0; i--)

Gdybyś dał zamiast auto np. int lub cokolwiek ze znakiem, to problemu by nie było, a tak std::string::length zwraca wartość typu unsigned, zatem i także jest takiego typu, a ten typ nie ma wartości poniżej zera. Wnioski wyciągnij sam ;)


Nawiasem:

        reverseStr(n1);
        reverseStr(n2);
         
        std::stringstream ss1;
        ss1 << n1;
        ss1>> a;
         
        std::stringstream ss2;
        ss2 << n2;
        ss2 >> b;

Można przecież tak:

std::reverse(n1.begin(), n1.end());
std::reverse(n2.begin(), n2.end());
     
std::istringstream(n1) >> a;
std::istringstream(n2) >> b;
komentarz 17 lutego 2022 przez tonn204 Mądrala (7,440 p.)

Poprawiłem kod i teraz pokazuje mi się inny problem w tej linii 68. O jakie przepełnienie tam chodzi jak użyłem chyba największego możliwego typu? 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
#include <string>
#include <sstream>

class Solution {
public:
    void push(ListNode** head_ref, signed long new_data)
    {
        
        ListNode* new_node = new ListNode();
        
        new_node->next = NULL;
        new_node->val = new_data;
        
        if(*head_ref == NULL)
        {
            *head_ref = new_node;
            return;
        }
        
        ListNode* curr = *head_ref;
        while(curr->next != NULL){
            curr = curr->next;
        }
        curr->next = new_node;
    }
    
    void reverseStr(string& str)
    {
        int n = str.length();

        for (int i = 0; i < n / 2; i++)
            swap(str[i], str[n - i - 1]);
    }
    
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        std::string n1, n2;
        signed long long a = 0, b = 0;
        
        while (l1 != nullptr)
        {
            n1 += std::to_string(l1->val);
            l1 = l1->next;
        }
        
        while (l2 != nullptr)
        {
            n2 += std::to_string(l2->val);
            l2 = l2->next;
        }
        
        std::reverse(n1.begin(), n1.end());
        std::reverse(n2.begin(), n2.end());
      
        std::istringstream(n1) >> a;
        std::istringstream(n2) >> b;

        
        long long z = a + b;
        std::string answer = std::to_string(z);
        
        ListNode* root = NULL;
        
        for(int i = answer.length()-1; i >= 0; i--)
        {
            char t =  answer[i];
            signed long  temp = t - '0';
            push(&root, temp);
        }
                
        return root;
    }
};
Line 68: Char 25: runtime error: signed integer overflow: 9223372036854775807 + 465 cannot be represented in type 'long long' (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:77:25

 

komentarz 17 lutego 2022 przez j23 Mędrzec (194,920 p.)

W sumie masz napisane, w czym jest problem. Suma a i b jest większa od pojemności typu long long.

Pewnie zadanie nie polega na prostym zsumowaniu dwóch liczb, które mieszczą się we wbudowanych typach (stąd te listy).

Podobne pytania

0 głosów
1 odpowiedź 195 wizyt
pytanie zadane 1 maja 2022 w C i C++ przez DarkJedx Nowicjusz (190 p.)
0 głosów
0 odpowiedzi 339 wizyt
pytanie zadane 29 września 2021 w C i C++ przez diedassel Użytkownik (570 p.)
0 głosów
1 odpowiedź 226 wizyt
pytanie zadane 4 sierpnia 2020 w C i C++ przez Arek04 Użytkownik (700 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...