Я создал функцию int reverseNum(Node *head)
для получения номера из обратносвязанного списка.
например. для связанного списка:- 1->2->3->4 число будет 4321.
Но программа возвращает 4320.
#include <bits/stdc++.h>
#define vi vector<int>
using namespace std;
struct Node {
int data;
Node *next;
Node(int x,Node *n){
data=x;
next=n;
}
Node(int x){
data=x;
next=nullptr;
}
};
//arr to LL
Node *arrToLL(vector<int> &arr){
//chk if the arr is empty
if (arr.empty()){
return nullptr;
}
Node *head=new Node(arr[0]);
Node *tmp=head;
for (int i=1;i<arr.size();i++){
Node *newNode=new Node(arr[i]);
tmp->next=newNode;
tmp=newNode;
}
return head;
}
//get reverse number from the LL
int reverseNum(Node *head){
int ans=0;
int exp=0;
while (head!=nullptr){
ans += (head->data * pow(10, exp));
cout<<ans<<"-";
exp++;
head=head->next;
}
return ans;
}
int main(){
vi arr1 = {1,2,3,4};
vi arr2 = {3,5,6};
Node *head1=arrToLL(arr1);
Node *head2=arrToLL(arr2);
cout<<reverseNum(head1);
return 0;
}
проблема может быть вне функции. Этот пример работает отлично: godbolt.org/z/rdqqcvK7K
Я тоже не могу это воспроизвести. Предоставьте код, который вызывает эту функцию с упомянутым вами связанным списком и который печатает результат, чтобы мы могли воспроизвести эту проблему.
Вы пробовали пройти код с помощью отладчика?
Чутье подсказывает мне, что это случай Почему pow(n,2) возвращает 24, когда n=5, с моим компилятором и ОС?, но сложно сказать наверняка, единственная ли это проблема.
Не имеет отношения к вашей проблеме: Почему мне не следует #include <bits/stdc++.h>? и В чем проблема с «использованием пространства имен std;»?
какой у тебя компилятор и его версия? По-прежнему не могу воспроизвести вашу проблему даже с отредактированным фрагментом.
ans += (head->data * pow(10, exp));
-- Ваша программа не работает из-за использования функции с плавающей запятой pow
. Во всем задании, которое вам было дано, используются указатели и целые числа — нет необходимости использовать (возможно, неточные) вычисления с плавающей запятой.
Функция pow
возвращает тип double
, поскольку она использует алгоритм с плавающей запятой. Это может привести к неточностям, как это произошло с пользователем, который спросил Почему pow(n,2) возвращает 24, когда n=5, с моим компилятором и ОС?.
Для этого вам не нужно полагаться на вычисления с плавающей запятой. Вместо exp
используйте переменную необходимой вам мощности, которая умножается на 10 на каждой итерации:
int reverseNum(Node *head){
int ans=0;
int power=1; // <---
while (head!=nullptr){
ans += head->data * power; // <---
cout<<ans<<"-";
power *= 10; // <---
head=head->next;
}
return ans;
}
Теперь в вашем коде больше нет обработки с плавающей запятой, и результат будет таким, как ожидалось.
Примечание: имейте в виду, что структура данных связанного списка может содержать гораздо больше цифр, чем может представить int
. Вы по-прежнему будете получать неверные результаты для связанных списков, содержащих около 30 цифр.
Пожалуйста, прочитайте описания тегов перед их использованием. Это не имеет ничего общего с дса.