Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- using namespace std;
- void outputTask() {
- cout << "Данная программа находит все числе Мерсена (число, которое может быть представлено 2p - 1, где p - простое число), которые меньше введенного N." << endl;
- }
- void outputNum(int number) {
- cout << "Введенное число: " << number << endl;
- }
- string inputPath() {
- string path;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cin >> path;
- ifstream fin(path);
- if (fin.is_open() and (size(path) > 4) and ((path[size(path) - 1] == 't') and (path[size(path) - 2] == 'x') and (path[size(path) - 3] == 't') and (path[size(path) - 4] == '.'))) {
- cout << "Файл успешно открыт!" << endl;
- }
- else {
- cout << "Ошибка открытия файла!" << endl;
- isNotCorrect = true;
- }
- fin.close();
- } while (isNotCorrect);
- return path;
- }
- int inputFromConsole() {
- bool isNotCorrect;
- int number;
- do {
- isNotCorrect = false;
- cout << "Введите натуральное число: " << endl;
- cin >> number;
- if((cin.fail() || (number < 1))) {
- isNotCorrect = true;
- cout << "Ошибка! Повторите попытку." << endl;
- cin.clear();
- while(cin.get() != '\n');
- }
- } while(isNotCorrect);
- return number;
- }
- void inputNumFromFile(int& number, string path) {
- ifstream fin(path);
- fin >> number;
- cout << "Ввод с файла..." << endl;
- if (fin.fail() || (number < 1)) {
- cout << "Ошибка! Введите число с клавиатуры. " << endl;
- fin.clear();
- while(fin.get() != '\n');
- number = inputFromConsole();
- }
- fin.close();
- }
- int inputFromFile() {
- string path;
- int number;
- cout << "Введите путь файла с данными: " << endl;
- path = inputPath();
- inputNumFromFile(number, path);
- outputNum(number);
- return number;
- }
- bool isFromFile() {
- bool isNotCorrect;
- int chooseNum;
- do {
- isNotCorrect = false;
- cout << "Выберите, откуда вводить данные: 1, если с файла; 0, если с консоли" << endl;
- cin >> chooseNum;
- if (cin.fail() or ((chooseNum != 1) and (chooseNum != 0))) {
- cout << "Ошибка ввода!" << endl;
- isNotCorrect = true;
- cin.clear();
- while(cin.get() != '\n');
- }
- } while(isNotCorrect);
- return (chooseNum == 1);
- }
- int inputNumber() {
- int number;
- if (isFromFile()) {
- number = inputFromFile();
- }
- else {
- number = inputFromConsole();
- }
- return number;
- }
- void checkForNumbers(int number, int*& answerNumbers, int& countOfNumbers) {
- countOfNumbers = 0;
- int maxExponent = 0;
- int* newAnswerNumbers;
- int mersenneNumber;
- while ((1 << maxExponent) - 1 < number) {
- maxExponent++;
- }
- for (int i = 0; i < maxExponent; ++i) {
- mersenneNumber = (1 << i) - 1;
- if (mersenneNumber < number) {
- countOfNumbers++;
- newAnswerNumbers = new int[countOfNumbers];
- for (int j = 0; j < countOfNumbers - 1; ++j) {
- newAnswerNumbers[j] = answerNumbers[j];
- }
- newAnswerNumbers[countOfNumbers - 1] = mersenneNumber;
- delete[] answerNumbers;
- answerNumbers = newAnswerNumbers;
- }
- }
- }
- void outputAnswer(int* answerNumbers, int countOfNumbers) {
- string path;
- cout << "Числа мерсена: " << endl;
- for(int i = 0; i < countOfNumbers; i++) {
- cout << answerNumbers[i] << " ";
- }
- cout << "\nВведите путь файла для вывода: " << endl;
- path = inputPath();
- ofstream fout(path);
- fout << "Числа мерсена: " << endl;
- for(int i = 0; i < countOfNumbers; i++) {
- fout << answerNumbers[i] << " ";
- }
- fout.close();
- cout << "Данные успешно записаны в файл." << endl;
- }
- int main() {
- system("chcp 1251");
- int countOfNumbers;
- int* answerNumbers;
- int number;
- outputTask();
- number = inputNumber();
- checkForNumbers(number, answerNumbers, countOfNumbers);
- outputAnswer(answerNumbers, countOfNumbers);
- delete[] answerNumbers;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement