yorik1984,
ну я о чем и говорю, изначально неправильно думал что результат будет целочисленным, потом идя домой решил что надо как вы и сказали каждое число делить на кол-во понял что мне нужен тип с плавоющей точной для результата.
максимальный который я знаю это double, но он знаковый 64 разрядный, а значит в плюсе на половину сократится и опять переполнение будет.
P.S.
u_int64_t это по разрядам тот же unsigned long long.
А нужен тип такого же разряда только с плавоющей точкой(
Пользователь решил продолжить мысль 16 Мая 2013, 15:23:09:
итак:
оказалось есть тип long double, который 16 байт, ну думаю все, готово.
А фиг там. Запускаю с n^7 и все норм. n^8 и дохнет. включил отладку, заметил что даже 1 процесс в своем диапазоне(например главный
10000000 до 20000000 не проходит все числа)
закоментил остальное чтобы можно было протестить. Собственно еще сделал чтобы каждое число выводило которое проверяет чтобы знать что не зависло где то. Останавливается у меня на 12161364 упорно. Дай думаю гляну может в ф-и проверки ошибка, не, работает. запустил чтобы вместо диапазона так же проверило 12161364 все эти разы. фиг там, на 81** раз сдохло.
Записал другое и прошло.
у кого есть время, посмотрите пожалуйста?(( хоть бы 1 диапазон пройти полностью в 10^8 ((
#include <iostream>
#include <stdlib.h>
#include <sys/wait.h>
#include <inttypes.h>
#include <string>
#include <stdio.h>
#include <math.h>
using namespace std;
bool components(const u_int64_t &number, const int8_t &size, const int &fd)
{
u_int64_t capasity = pow(10.0, size-1);
u_int64_t capasity1 = pow(10.0, size);
u_int64_t t = number;
for(int i = 0; i < size; i++)
{
t = t % capasity1;
if(!t)
return false;
if(! (t/capasity) )
return false;
if(number % (t/capasity))
return false;
capasity /= 10;
capasity1 /= 10;
}
write(fd, &number, sizeof(u_int64_t));
return true;
}
int main()
{
u_int64_t countResult = 0; //сколько подходящих чисел
long double amount = 0; // среднее значение
u_int64_t temp = 0; // записываем сюда
u_int64_t capasity; // для диапазона
u_int64_t maxNumber;
u_int64_t startNumber;
u_int8_t no = 1; //диапазон (главный процесс с числами 1*
u_int8_t j;
int size;
int i;
int fdResult[2], fdCountResult[2]; // каналы. fdCount - подсчет результатов
bool fl = false;
if(pipe(fdResult) < 0 || pipe(fdCountResult) < 0)
{
cout << "error creat" << endl;
return 0;
}
while(! fl )
{
cout << "size: ";
cin >> size;
if(size < 11 || size > 0) //почему то тут кстати если size сделать int8_t то не проходит
fl = true;
}
capasity = pow(10.0, size-1);
// for(j = 2; j < 10; j++)
// {
// if(fork() == 0)
// {
// no = j;
// break;
// }
// }
startNumber = capasity * no;
maxNumber = capasity * (no+1);
while(startNumber < maxNumber)
{
cout << startNumber << endl; // то что еще идут вычисления
if(components(startNumber, size, fdResult[1]))
countResult++;//подсчет чисел в своем диапазоне
startNumber++;
}
if(no != 1)
{
write(fdCountResult[1], &countResult, sizeof(u_int64_t)); //все дочерние записывают свое кол-во с канал fdCountResult
return 0;
}
for(i = 0; i < 9; i++)
wait(0); //100% ожидание завершения всех процессов (нет дочернего процесса, wait(0) не будет в ожидании
cout << "result: " << endl;
// for(i = 2; i < 10; i++)
// {
// read(fdCountResult[0], &temp, sizeof(u_int64_t)); // из каждого дочернего получаем его кол-во чисел и записываетм в countResult сумму их
// countResult += temp;
// }
// if(! countResult )
// {
// cout << endl << "no number" << endl;
// return 0;
// }
// else
// {
// i = countResult; // собственно столько чисел записанно в канал fdResult
// while(i--)
// {
// read(fdResult[0], &temp, sizeof(u_int64_t));
// amount +=double(temp)/countResult;
// }
// cout << endl << endl << endl << amount << endl;
// }
return 0;
}