Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
LaLeka
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 139
1

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

02.11.2017, 10:41. Просмотров 725. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2017, 10:41
Ответы с готовыми решениями:

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

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

длинная арифметика. Умножение большого числа на малое
Столкнулся с небольшой проблемой: при умножении большого числа (примерно 9...

Длинная арифметика: найти частное и остаток от деления числа a на b
Даны два длинных числа a и b. Найти частное и остаток при делении числа a на b....

C клавиатуры вводятся два вещественных числа. Вывести результат их произведения в виде равенства. Например, для введенных чисел 5 и 7 вывести 5*7=35
Пожалуйста помогите!

4
evstarylan
19 / 18 / 19
Регистрация: 01.11.2017
Сообщений: 48
Завершенные тесты: 1
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
LaLeka
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 139
02.11.2017, 11:26  [ТС] 3
спасибо! все понятно!
но не могу придумать, что делать дальше. помогите, пожалуйста
0
evstarylan
19 / 18 / 19
Регистрация: 01.11.2017
Сообщений: 48
Завершенные тесты: 1
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
LaLeka
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 139
02.11.2017, 12:03  [ТС] 5
огромное спасибо! благодаря вашим пояснениям, я разобралась с данным заданием.
0
02.11.2017, 12:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2017, 12:03

Длинная арифметика. Найти количество делителей n-значного натурального числа (n > 20)
Найти количество делителей n-значного натурального числа (n &gt; 20). Помогите...

Распарсить выражение, состоящее из чисел, скобок и знаков сложения и вычитания, и вывести результат
Сложение и вычитание Имя входного файла: evalpm.in Имя выходного файла:...

Рандомное заполнение матрицы, причем от числа до числа, введенного с клавиатуры
Подскажите ,пожалуйста, как сделать рандомное заполнение матрицы,причем от...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru