Дан файл целых чисел. Получить новый файл, в котором располагаются сначала все совершенные элементы, а потом остальные
bool sov(int x)
{
int s = 0;
for (int i = 1; i < x; i++)
{
if (x % i == 0) s += i;
}
if (s == x) return true;
else return false;
}
int main()
{
int n, x;
ofstream f("f.txt");
cout << "Enter kol-vo" << endl;
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "Enter elem" << endl;
cin >> x;
f << x << endl;
}
f.close();
cout << "File:";
ifstream h;
h.open("f.txt");
ofstream g("g.txt");
while (!h.eof())
{
h >> x;
if (!h.eof()) {
if (sov(x))
g << x << endl;
}
}
h.seekg(0, ios::beg); //пробовала без этой строчки
while (!h.eof())
{
h >> x;
if (!h.eof()) {
if (!sov(x))
g << x << endl;
}
}
h.close();
g.close();
h.open("g.txt");
while (!h.eof())
{
h >> x;
if (!h.eof()) cout << x << " ";
}
h.close();
}
Написала программу, но она выводит только совершенные числа, а остальные нет. Не понимаю в чем проблема, подскажите пожалуйста как довести программу до рабочего состояния?
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Да все просто: после первого чтения файл заходит в состояние fail, и ему надо сбросить это состояние...
h.clear();
h.seekg(0, ios::beg); //пробовала без этой строчки
while (!h.eof())
Видите это h.clear()?
Но... а такой более простой (и быстрый... введите с десяток чисел в районе миллиарда в свою программу и посмотрите, сколько кофе успеете выпить за время счета...) вариант вы не хотите рассмотреть?
#include <vector>
#include <fstream>
#include <iostream>
using namespace std;
bool sov(unsigned long long x)
{
static unsigned long long sn[] =
{ 6, 28, 496, 8128, 33550336, 8589869056, 137438691328 };
for(auto s: sn)
if (s == x) return true;
return false;
}
int main()
{
{
unsigned long long n, x;
ofstream f("f.txt");
cout << "Enter kol-vo" << endl;
cin >> n;
for (unsigned long long i = 0; i < n; i++)
{
cout << "Enter elem" << endl;
cin >> x;
f << x << endl;
}
}
{
ifstream h("f.txt");
ofstream g("g.txt");
vector<unsigned long long> perf, nperf;
for(unsigned long long x ;h >> x;)
if (sov(x)) perf.push_back(x);
else nperf.push_back(x);
for(auto x: perf) g << x << endl;
for(auto x: nperf) g << x << endl;
}
{
ifstream h("g.txt");
for(unsigned long long x ;h >> x;)
cout << x << endl;
}
}