как исправить 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 <

20 Дек 2023 в 23:43
82 +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 charc:inputchar c : inputcharc:input {

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

      return false;

    }

  }

  return true;

}


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

string divide_by_two(const string &num) {

  string result;

  int carry = 0;

  for charc:numchar c : numcharc:num {

    if (c == ' ') continue;

    int n = carry * 10 + c−′0′c - '0'c0;

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

    carry = n % 2;

  }

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

    result.erase0,10, 10,1;

  }

  return result;

}


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

string dec_to_octstringnumstring numstringnum {

  string oct;

  while num!="0"num != "0"num!="0" {

    int rem = 0;

    string temp;

    for charc:numchar c : numcharc:num {

      if (c == ' ') continue;

      int n = rem * 10 + c−′0′c - '0'c0;

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

      rem = n % 8;

    }

    oct = to_stringremremrem + oct;

    num = temp;

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

      num.erase0,10, 10,1;

    }

  }

  return oct.empty ? "0" : oct;

}


int main {

  string input;

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

  while truetruetrue {

    getlinecin,inputcin, inputcin,input;

    if checkinput(input)check_input(input)checki nput(input) {

      string result = dec_to_octinputinputinput;

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

      break;

    } else {

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

    }

  }

  return 0;

}


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

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