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

Problem z zadaniem na LeetCode.

VPS Starter Arubacloud
0 głosów
325 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ź 189 wizyt
pytanie zadane 1 maja 2022 w C i C++ przez DarkJedx Nowicjusz (190 p.)
0 głosów
0 odpowiedzi 320 wizyt
pytanie zadane 29 września 2021 w C i C++ przez diedassel Użytkownik (570 p.)
0 głosów
1 odpowiedź 200 wizyt
pytanie zadane 4 sierpnia 2020 w C i C++ przez Arek04 Użytkownik (700 p.)

92,454 zapytań

141,262 odpowiedzi

319,090 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...