Как отменить мой вклад, включая отрицательный - PullRequest
0 голосов
/ 31 января 2020

Это мой код, который у меня есть в настоящее время, но он всегда выводит 0 Я пытаюсь заставить его вывести обратный ввод, включая отрицательный, например, -123425 будет 524321 -:

#include<iostream>
using namespace std;

int main() {
    int number;
    bool negative;
    cout << "Enter an integer: ";
    cin >> number;
    while (number != 0) {
        number % 10;
        number /= 10;
    }
    if (number < 0) {
        negative = true;
        number = -number;
        cout << number << "-";
    }
    else {
        negative = false;
    }
    cout << number << endl;

    return EXIT_SUCCESS;
}

Ответы [ 6 ]

2 голосов
/ 31 января 2020

Вы можете преобразовать ввод в std::string, а затем обратить его содержимое с помощью std::reverse.

#include <algorithm> // reverse
#include <cstdlib>   // EXIT_SUCCESS
#include <iostream>  // cin, cout, endl
#include <string>    // string, to_string

using namespace std;

int main()
{
    cout << "Enter an integer: ";
    int number;
    cin >> number;
    auto str = to_string(number);

    reverse(str.begin(), str.end());
    cout << str << endl;

    return EXIT_SUCCESS;
}

Считывание сначала int, а не std::string - гарантирует, что мы анализируем правильное целое число из входных данных. Преобразование его в std::string позволяет нам обратить его вспять. Это позволяет нам вводить в программу данные типа -042 и -0 и получать в результате 24- и 0, а не 240- и 0-.

1 голос
/ 31 января 2020

После первого l oop

while (number != 0) {
    number % 10;
    number /= 10;
}

переменная number равна 0.

Поэтому следующий оператор if

if (number < 0) {
    negative = true;
    number = -number;
    cout << number << "-";
}
else {
    negative = false;
}

не имеет смысла.

Обратите внимание, что это может произойти таким образом, что обратное число не может поместиться в объект типа int. Таким образом, для номера результата вы должны выбрать больший целочисленный тип.

Вот демонстрационная программа, которая показывает, как может быть выполнено присваивание.

#include <iostream>

int main() 
{
    std::cout << "Enter an integer: ";

    int n = 0;

    std::cin >> n;

    bool negative = n < 0;
    const int Base = 10;

    long long int result = 0;

    do
    {
        int digit = n % Base;
        if ( digit < 0 ) digit = -digit;
        result = Base * result + digit;  
    } while ( n /= Base );

    std::cout << result;
    if ( negative ) std::cout << '-';
    std::cout << '\n';

    return 0;
}

Его вывод может выглядеть как

Enter an integer: 123456789
987654321-
0 голосов
/ 31 января 2020

Я думаю, что попытка визуализировать процесс вашей программы - отличный способ проверить, выполняет ли ваше решение то, что вы ожидаете. Для этого предположим, что наш number будет 12345. Код говорит, что хотя это не равно 0, мы сделаем number % 10, а затем number /= 10. Так что если у нас есть 12345, то:

number % 10 -> 12345 % 10 -> 5 не назначено никакому значению, поэтому никаких изменений не производится. Это будет верно во время каждой итерации while l oop, за исключением различных значений number на этом пути.

number /= 10 -> 12345 /= 10 -> 1234

number /= 10 -> 1234 /= 10 -> 123

number /= 10 -> 123 /= 10 -> 12

number /= 10 - -> 12 /= 10 -> 1

number /= 10 -> 1 /= 10 -> 0 (из-за целочисленного деления)

Теперь, когда number == 0 true, мы переходим к блоку if/else, и, поскольку number < 0 равно false, мы всегда переходим к блоку else и затем заканчиваем sh с помощью оператора cout. Обратите внимание, что в то время как l oop будет требовать number == 0, чтобы быть верным для выхода, поэтому эта программа всегда будет выводить 0.

Чтобы обойти это, вам, вероятно, понадобится либо чтобы создать отдельное число, в котором вы можете хранить последние цифры по мере прохождения l oop, придавая им правильный вес, умножая их на степени 10 (аналогично тому, что вы надеетесь сделать), или приводите свой номер к строке и печатать каждый индекс строки в обратном порядке, используя al oop.

0 голосов
/ 31 января 2020

с использованием пространства имен std;

int main ()

{

int number,flag=1;
long long int revnum=0;
bool negative;
cout << "Enter an integer: ";
cin >> number;
if(number<0)
{   negative=true;

}
while (number > 0) {
    revnum=revnum*10+number %10;   
    number /= 10;
}
if (negative)
{     revnum=(-revnum);
     cout << revnum << '-'<<endl;
 }
 else
 { cout<<revnum<<endl;
  }


return 0;

}

Несколько изменений, которые я сделал -

  1. проверка числа, является ли оно отрицательным или положительным

  2. , если отрицательное, преобразует его в положительное значение

3. обращая число с помощью новой переменной revnum

4.и распечатайте его в соответствии с требованием

Чтобы изменить число -

revnum = revnum * 10 + number% 10

затем num = num / 10

вроде давайте попробуем визуализировать

1.берите число, например, как 342

2.для первого шага revnum = 0, поэтому revnum * 10 = 0 и num% 10 = 2, поэтому revnum будет 2

и теперь число равно num / 10, так что 34

4. следующее время rev = 2, rev * 10 = 20 и num% 10 = 4, затем rev * 10 + num / 10 = 24

5. В итоге получаем 243

Надеюсь, это поможет:)

edit: - просто небольшая правка для решения проблемы переполнения int, сделанная revnum as long long int.

0 голосов
/ 31 января 2020

Довольно просто:

int reverse(int n){
    int k = abs(n);     //removes the negative signal
    while(k > 0){
        cout<<k % 10;   //prints the last character of the number
        k /= 10;        //cuts off the last character of the number
    }
    if(n < 0) cout<<"-";    //prints the - in the end if the number is initially negative
    cout<<endl;
}

int main(){
    int n = -1030;     //number you want to reverse
    reverse(n);
}
0 голосов
/ 31 января 2020

Если вы не хотите использовать String или должны использовать int, вот решение.

Вы хотите проверить отрицательность, прежде чем вносить изменения в число, иначе число будет 0, когда это выйдет пока l oop. Кроме того, модуль будет отрицательным, если ваше число будет отрицательным.

число% 10 принимает только модуль числа, поэтому вы хотите сделать это вместо того, чтобы просто оставить его там.

последняя строка, которая у вас есть cout << number << endl;, будет 0, так как число должно быть 0, чтобы выйти, а l oop.

    if(number < 0) {
      number = -number;
      negative = true;
    }
    while (number != 0) {
        cout << number % 10;
        number /= 10;
    }
    if (negative) {
        cout << "-"<< endl;
    }

РЕДАКТИРОВАТЬ: с более широким допущением ввода, принимающего все значения типа int вместо обратное целое число является допустимым типом int. Вот измененное решение.

    if(number < 0) {
      negative = true;
    }
    while (number != 0) {
        cout << abs(number % 10);
        number /= 10;
    }
    if (negative) {
        cout << "-"<< endl;
    }
...