как исправить long long, что высчитывало любое число( у long long усть ограничение по количеству знаков)
#include
#include
#include
using namespace std;
// Функция для проверки ввода
bool check_input(const string &input) {
// Проходим по каждому символу в строке
for (char c : input) {
// Если символ не является цифрой или пробелом, возвращаем false
if (!(isdigit(c) || c == ' ')) {
return false;
}
}
// Если все символы корректны, возвращаем true
return true;
}
// Функция для преобразования десятичного числа в восьмеричное
string dec_to_oct(const string &dec) {
string oct = "";
string num = dec;
while (num != "0") {
string rem = to_string(int (num) % 8);
oct = rem + oct;
num = to_string(stoi(num) / 8);
}
return oct;
}
int main() {
string input;
// Запрашиваем у пользователя число
cout << "Введите натуральное число: ";
while (true) {
getline(cin, input);
if (check_input(input)) {
// Преобразуем число в восьмеричную систему
string result = dec_to_oct(input);
// Если получили сообщение об ошибке, запрашиваем число заново
if (result.substr(0, 6) == "Ошибка") {
cout << result << " Пожалуйста, введите значение заново: ";
} else {
cout << "Число в системе счисления с основанием восемь: " << result << endl;
break;
}
} else {
cout << "Некорректный ввод. Пожалуйста, введите значение заново: ";
}
}
return 0;
}

20 Дек 2023 в 23:43
52 +1
0
Ответы
1

Ваш код содержит несколько проблем, которые могут привести к неправильной работе программы. Основная проблема заключается в том, что вы пытаетесь использовать тип int для преобразования больших чисел, что приведет к переполнению, если число превысит максимальное значение для int. Кроме того, функция stoi также не подходит для работы с большими числами, так как она работает только с типом int.

Чтобы исправить эту проблему, вы можете использовать библиотеку, которая поддерживает работу с большими числами, например, Boost.Multiprecision или GMP. Однако, если вы хотите ограничиться стандартной библиотекой C++, вам придется реализовать алгоритм деления и остатка от деления для больших чисел вручную.

Ниже приведен пример исправленного кода, который использует строковые операции для преобразования большого десятичного числа в восьмеричное:

С++

#include <iostream>

#include <string>

#include <cctype>


using namespace std;


// Функция для проверки ввода

bool check_input(const string &input) {

  for (char c : input) {

    if (!(isdigit(c) || c == ' ')) {

      return false;

    }

  }

  return true;

}


// Функция для деления строки на число

string divide_by_two(const string &num) {

  string result;

  int carry = 0;

  for (char c : num) {

    if (c == ' ') continue;

    int n = carry * 10 + (c - '0');

    result += (n / 2) + '0';

    carry = n % 2;

  }

  if (result[0] == '0' && result.length() > 1) {

    result.erase(0, 1);

  }

  return result;

}


// Функция для преобразования десятичного числа в восьмеричное

string dec_to_oct(string num) {

  string oct;

  while (num != "0") {

    int rem = 0;

    string temp;

    for (char c : num) {

      if (c == ' ') continue;

      int n = rem * 10 + (c - '0');

      temp += (n / 8) + '0';

      rem = n % 8;

    }

    oct = to_string(rem) + oct;

    num = temp;

    while (num.length() > 1 && num[0] == '0') {

      num.erase(0, 1);

    }

  }

  return oct.empty() ? "0" : oct;

}


int main() {

  string input;

  cout << "Введите натуральное число: ";

  while (true) {

    getline(cin, input);

    if (check_input(input)) {

      string result = dec_to_oct(input);

      cout << "Число в системе счисления с основанием восемь: " << result << endl;

      break;

    } else {

      cout << "Некорректный ввод. Пожалуйста, введите значение заново: ";

    }

  }

  return 0;

}


Этот код использует строковые операции для деления числа на 8 и получения остатка, что позволяет работать с числами, превышающими ограничения типа int. Обратите внимание, что в этом коде не обрабатываются ведущие пробелы и нули в вводе, что может потребовать дополнительной обработки в зависимости от ваших требований.

22 Дек 2023 в 22:43
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир