1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 161
1

Длинная арифметика: вывести результат вычитания единицы из числа, введенного с клавиатуры

02.11.2017, 10:41. Показов 1117. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Задача: вывести на экран результат вычитания единицы из числа, введенного с клавиатуры. Гарантировано, что числа не вместятся ни в один стандартный тип переменных.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
    string input, output;
    cin>>input;
    int x;
    if (input[input.length()-1]!=0) {
        for (int i=input.length()-1; i>=0; i++) {
            if (i==input.length()-1) {
                x=input[i]-'0'-1;
                char y=char(x)+'0';
                output+=y;
            }
            x=input[i]-'0';
            char y=char(x)+'0';
            output+=y;
        }
        reverse(output.begin(), output.end());
        cout<<output;
    }
 
}
Программа не работает. Подскажите, пожалуйста, как исправить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2017, 10:41
Ответы с готовыми решениями:

Вычислить факториал введенного числа n! (0<n<1001) и вывести результат
Вычислить факториал введенного числа n! (0&lt;n&lt;1001) и вывести результат Помогите пожалуйста...

Вывести абсолютное значение введенного с клавиатуры числа
Задача на указатели. Напишите функцию, выводящую абсолютное значение введенного с клавиатуры числа.

Вывести двоичное представление введенного с клавиатуры десятичного числа
Помогите написать программу которая выводит двоичное представление введенного с клавиатуры...

Вывести квадрат введенного с клавиатуры числа в диапазоне от 0 до 10 включительно
Написать программу, которая выводит квадрат, введенного с клавиатуры, числа в диапазоне от 0 до 10...

4
20 / 19 / 19
Регистрация: 01.11.2017
Сообщений: 48
02.11.2017, 11:15 2
Здравствуйте!
Вот исправления с комментариями.
Программа обрабатывает только случай, когда последняя цифра не ноль - это нормально? Могу помочь дописать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <algorithm>
#include <string>
 
using namespace std;
 
int main() {
    string input, output;
    cin >> input;
    int x;
    if (input[input.length() - 1] != '0') { // Вы сравнивали код символа с нулем, но код нуля не ноль.
        for (int i = input.length() - 1; i >= 0; i--) { // Было i++, поэтому программа и падала.
            if (i == input.length() - 1) {
                x = input[i] - '0' - 1;
                char y = char(x) + '0';
                output += y;
                // Oбратите внимание, что, если вы уже изменили последнюю цифру, больше ничего на этой иттерации в строку добавлять не нужно
                // (иначе вы добавите и измененную цифру, и исходную). Можно поставить continue, например.
                continue; 
            }
            x = input[i] - '0';
            char y = char(x) + '0';
            output += y;
        }
        reverse(output.begin(), output.end());
        cout << output;
    }
}
1
1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 161
02.11.2017, 11:26  [ТС] 3
спасибо! все понятно!
но не могу придумать, что делать дальше. помогите, пожалуйста
0
20 / 19 / 19
Регистрация: 01.11.2017
Сообщений: 48
02.11.2017, 12:00 4
Лучший ответ Сообщение было отмечено LaLeka как решение

Решение

Представьте вычитание в столбик. Когда у нас ноль, мы пишем 9 и запоминаем, что предыдущую цифру тоже нужно будет изменить. Сделаем тоже самое с помощью флага.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <algorithm>
#include <string>
 
using namespace std;
 
int main() {
    string input, output;
    cin >> input;
 
    int x;
    bool flag = 0;
 
    for (int i = input.length() - 1; i >= 0; i--) {
        if (i == input.length() - 1) {
            x = input[i] - '0';
            if (x == 0) {
                x = 9;
                flag = 1;
            }
            else
                x--;
            char y = char(x) + '0';
            output += y;
            continue;
        }
        x = input[i] - '0';
        if (flag == 1) {
            if (x == 0)
                x = 9;
            else {
                x--;
                flag = 0;
 
                if (i == 0 && x == 0 && input.length() != 1) //Избавляемся от ведующего нуля
                    break;
            }
        }
        char y = char(x) + '0';
        output += y;
    }
    reverse(output.begin(), output.end());
    cout << output;
}
Отпадает надобность рассматривать два случая.
Кстати, это работает только с натуральными числами. Вы не уточняли.
На ноль можно дописать отдельное условие, но если будут отрицательные, требует доработки.
1
1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 161
02.11.2017, 12:03  [ТС] 5
огромное спасибо! благодаря вашим пояснениям, я разобралась с данным заданием.
0
02.11.2017, 12:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2017, 12:03
Помогаю со студенческими работами здесь

Длинная арифметика: вывести n чисел Фибоначчи
Вывести в консоль n чисел Фибоначчи без переполнения #include &lt;stdio.h&gt; int main() { ...

Длинная арифметика. Возведение числа в степень
Для натуральных чисел A и B (1 &lt;= A &lt;= 9, 1 &lt;= B &lt;= 104) требуется вычислить значение AB. Прошу...

Длинная арифметика. Сравнить два числа
Составить программу для сравнения двух n-значных чисел (n &gt; 20). Учитывать знак числа.

Длинная арифметика/Класс большие числа
Всем привет, поставили такую задачу, нужно реализовать класс большие числа и операции над ними....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru