Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Задание 2
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include <cmath>
- #include <Windows.h>
- void writeFile(const int num, const std::string& str) // записываем числа в файл
- {
- std::ofstream out_f(str, std::ios::app); // открываем файл для записи в конец
- out_f << num << " "; // записываем данные
- out_f.close(); // закрываем файл
- }
- void readFile(const std::string& str, std::vector<int>& vec, const bool flag) // считываем числа из файла в массив
- {
- int num;
- std::ifstream in_f(str, std::ios::in); // открываем файл для чтения
- if (in_f) { // если файл открылся
- while (in_f && in_f >> num) { // пока нет ошибок и EOF, извлекаем данные
- std::cout << num << " "; // выводим все числа из файла
- if (flag)
- vec.push_back(num); // присваиваем числа из файла в vector
- }
- in_f.close(); // закрываем файл
- }
- else
- std::cout << "Файл \"" << str << "\" не обнаружен\n";
- }
- int number(const int num) // определим какие из чисел являются счастливыми
- {
- int sum{}; // сумма квадратов цифр числа num
- for (int k = 0; k < 4; ++k) { // из числа получаем сумму цифр, 4 - max число разрядов sum
- int x = pow(10, k), y = pow(10, k + 1); // делители
- sum += pow((num % y - num % x) / x, 2); // вычленяем цифру, возводим в квадрат и добавляем к сумме
- }
- if (sum == 1) return true; // число счастливое
- if (sum == 4) return false; // число не счастливое
- if (sum != 0) return number(sum); // рекурсия с новым параметром (сумма квадратов чисел)
- return false; // число не счастливое
- }
- void luckyNumber(const std::string& str) // счастливые числа
- {
- for (int i{}; i <= 1000; ++i) // все числа (0 - 1000)
- if (number(i)) // если число счастливое,
- writeFile(i, str); // записываем в файл
- }
- void primeNumber(const std::string& str) // простые числа
- {
- for (int i{}; i <= 1000; ++i) // все числа (0 - 1000)
- for (int j(1); j <= i; ++j) {
- if ((i > j) && (j != 1) && (i % j == 0)) // если число не простое
- break; // выходим из цикла
- if (j == i && j != 1) // если число простое,
- writeFile(i, str); // записываем в файл
- }
- }
- void clear_file(const std::string& str_1, const std::string& str_2) // очищаем файлы от записей
- {
- std::ifstream out_f1(str_1, std::ios::out | std::ios::trunc); // очищаем 1_file.txt для последующей записи
- std::ifstream out_f2(str_2, std::ios::out | std::ios::trunc); // очищаем 2_file.txt для последующей записи
- }
- void delete_duplicate(std::vector<int>& vec_1, std::vector<int>& vec_2,
- const std::string& str_1, const std::string& str_2) // удаляем из файлов дубликаты
- {
- for (int i{}; i < vec_1.size(); ++i) // итерация простых чисел
- for (int j{}; j < vec_2.size(); ++j) // итерация счастливых чисел
- if (vec_1[i] == vec_2[j]) { // если числа дублируются, удаляем их
- vec_1.erase(vec_1.begin() + i);
- vec_2.erase(vec_2.begin() + j);
- }
- clear_file(str_1, str_2); // очищаем файлы от записей
- for (int k{}; k < vec_1.size(); ++k) // записываем простые числа, без дубликатов, в файл
- writeFile(vec_1[k], str_1);
- for (int q{}; q < vec_2.size(); ++q) // записываем счастливые числа, без дубликатов, в файл
- writeFile(vec_2[q], str_2);
- }
- int main()
- {
- SetConsoleCP(1251); SetConsoleOutputCP(1251);
- std::vector<int>vec_1, vec_2;
- const std::string str_1{ "C://1_file.txt" }; // адрес и имя файла для простых чисел
- const std::string str_2{ "C://2_file.txt" }; // адрес и имя файла для счастливых чисел
- clear_file(str_1, str_2); // очищаем файлы от записей
- primeNumber(str_1); // определяем простые числа и записываем в файл 1_file.txt
- luckyNumber(str_2); // определяем счастливые числа и записываем в файл 2_file.txt
- std::cout << "Простые числа из файла " << str_1 << " :\n";
- readFile(str_1, vec_1, true); // выводим из файла простые числа и присваиваем в vector
- std::cout << "\n\nСчастливые числа из файла " << str_2 << " :\n";
- readFile(str_2, vec_2, true); // выводим из файла счастливые числа и присваиваем в vector
- delete_duplicate(vec_1, vec_2, str_1, str_2); // удаляем дубликаты чисел
- std::cout << "\n\nПростые числа без дубликатов из файла " << str_1 << " :\n";
- readFile(str_1, vec_1, false); // выводим из файла простые числа без дубликатов
- std::cout << "\n\nСчастливые числа без дубликатов из файла " << str_2 << " :\n";
- readFile(str_2, vec_2, false); // выводим из файла счастливые числа без дубликатов
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement