как исправить 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; }
Ваш код содержит несколько проблем, которые могут привести к неправильной работе программы. Основная проблема заключается в том, что вы пытаетесь использовать тип 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. Обратите внимание, что в этом коде не обрабатываются ведущие пробелы и нули в вводе, что может потребовать дополнительной обработки в зависимости от ваших требований.
Ваш код содержит несколько проблем, которые могут привести к неправильной работе программы. Основная проблема заключается в том, что вы пытаетесь использовать тип 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. Обратите внимание, что в этом коде не обрабатываются ведущие пробелы и нули в вводе, что может потребовать дополнительной обработки в зависимости от ваших требований.