как исправить 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 <
Ваш код содержит несколько проблем, которые могут привести к неправильной работе программы. Основная проблема заключается в том, что вы пытаетесь использовать тип 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'c−′0′;
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'c−′0′;
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)checkinput(input) {
string result = dec_to_octinputinputinput;
cout << "Число в системе счисления с основанием восемь: " << result << endl;
break;
} else {
cout << "Некорректный ввод. Пожалуйста, введите значение заново: ";
}
}
return 0;
}
Этот код использует строковые операции для деления числа на 8 и получения остатка, что позволяет работать с числами, превышающими ограничения типа int. Обратите внимание, что в этом коде не обрабатываются ведущие пробелы и нули в вводе, что может потребовать дополнительной обработки в зависимости от ваших требований.
Ваш код содержит несколько проблем, которые могут привести к неправильной работе программы. Основная проблема заключается в том, что вы пытаетесь использовать тип 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'c−′0′;
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'c−′0′;
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. Обратите внимание, что в этом коде не обрабатываются ведущие пробелы и нули в вводе, что может потребовать дополнительной обработки в зависимости от ваших требований.