Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Очень медленный QCryptographicHash

Хочу получить хешь файла по алгоритму SHA256. Делаю это используя QCryptographicHash
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    ...
    ...
    QCryptographicHash h(QCryptographicHash::Sha256);
 
    QFile file(_filename);
    if (!file.open(QIODevice::ReadOnly)) return;
    QDataStream in(&file);
    qint64 sizeFile = file.size();
    qint64 countRead = 0;
 
    ui->progressBar->setValue(0);
 
    char *buffer = new char[1*1024*1024];
    uint len =sizeof(buffer);
 
    int readlen =0;
    while((readlen = in.readRawData(buffer,len))>0){
        countRead+=readlen;
        h.addData(buffer,readlen);
        ui->progressBar->setValue(countRead*100/sizeFile);
    }
 
   QString result=h.result().toHex().toLower();
Файл размером 584056832 хеширует 13 секунд


Код который переписал с использованием openssl отрабатывает за 4 секунды
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    unsigned char buffer_sha256[SHA256_DIGEST_LENGTH];
    SHA256_CTX mdContext;
    std::stringstream ss;
 
    std::ifstream file(filename, std::ios_base::binary);
    if (file){
        int countRead=0;
        uint64_t allRead=0;
 
        file.seekg(0, std::ios_base::end);
        uint64_t nFileLen = file.tellg();
        file.seekg (0, std::ios::beg);
 
        uint64_t lengthBuffer=1*1024*1024;
        char * buffer = new char [lengthBuffer+1];
 
        SHA256_Init (&mdContext);
        while((countRead = file.readsome(buffer,lengthBuffer))>0){
            if (file){
                allRead+=countRead;
                SHA256_Update (&mdContext, buffer,countRead);
                emit changeValue(allRead*100/nFileLen);
            }
        }
        SHA256_Final (buffer_sha256,&mdContext);
        delete[] buffer;
 
        for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){
            ss << std::hex << std::setw(2) << std::setfill('0') << (int)buffer_sha256[i];
        }
 
        file.close();
    }
 
    return ss.str();

Что не так в коде на Qt ? Я хочу не просто получить хешь, но и вести прогрессбар, так что QCryptographicHash::hash или QCryptographicHash::addData(QIODevice * device) не подходит.
Ответ: Вообщем, пока вот что получилось. Пришлось всё делать через openssl

Вопрос: Очень медленный SELECT и UPDATE

У меня есть база на несколько миллионов записей. Мне нужно в цикле сделать select а затем update. Но замерив с помощью microtime() запрос SELECT count(filed), я увидел что он занимает 1.5-2 секунды, что очень долго. Update, кстати тоже тормознутый. База на движке myisam, хотя innodb я тоже пробовал - те же грабли. Почему так медленно выполняются запросы и как мне улучшить ситуацию, потому что мне необходимо в цикле пройти все записи? Заранее спасибо.
Ответ:
OrmaJever пишет:
freelsd пишет:
но без циклов не получится

а я думаю получается... Просто вы не в ту сторону думаете

Поясните, пожалуйста.
Вопрос: QCryptographicHash примеры

Добрый день.
не могу разобраться как работать с QCryptographicHash, мне нужен метод с функцией Sha256, может кто то работал с этой библиотекой и может помочь пожалуйста
Ответ: ОТЛИЧНО ВСЕ ПОЛУЧИЛОСЬ, СПАСИБО БОЛЬШОЕ
Вопрос: Переход от одной формы к другой

Как сделать переход от одной формы к другой C#?
Переход как бы есть!
он очень медленный ,можно ли ускорить этот процесс?
Ответ:
Сообщение от FIGO
Переход как бы есть!
он очень медленный
Покажите какой у вас есть, посмотрим, чего он медленный.
Вопрос: Медленный SharpDX 2D

Привет всем!

Есть задача: отрисовать около 150 многоугольников примерно по 100-200 точек, залитых однородным цветом (у каждого свой цвет) на текстурке 1500х1500 пикселей.
Проблема в следующем: на Xeon 16 ядер, GTX Titan время выполнения сего действа составляет 60 мс.

Код отрисовки
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    drawingContext.BeginDraw();
for (int figureIndex = 0; figureIndex < count; figureIndex++)
{
    var figure = img.Figures[figureIndex];
    
 
 
    using (var geometry = GetGPUGeometryOf.Invoke(figure))
    {
        using (var brush = GetGPUBrushOf.Invoke(figure.Color, drawingContext))
        {
            drawingContext.FillGeometry(geometry, brush);
        }
    }
  
}
  drawingContext.EndDraw();
 
    drawingContext.Flush();
функции:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 GetGPUBrushOf = new Func<Clr, RenderTarget, SolidColorBrush>((clr, t) => new SolidColorBrush(t, clr) { Opacity = (float)this.Opacity });
 
            GetGPUGeometryOf = new Func<VectorFigureCompressed, PathGeometry>(figure =>
            {
                lock (BitmapGPU.GeometryFactory)
                {
                    var pnts = figure.Points;
                    var geo = new SharpDX.Direct2D1.PathGeometry(BitmapGPU.GeometryFactory);
                    using (var oro = geo.Open())
                    {
                        oro.BeginFigure(pnts.First(), FigureBegin.Filled);
                        oro.AddLines(pnts);
                        oro.EndFigure(new SharpDX.Direct2D1.FigureEnd());
                        oro.Close();
                    }
 
                    return geo;
                }
 
            });
кропотливые замеры каждого кусочка кода показали, что тормозит 3 вещи: создание геометрии, создание кисточки, и, собственно, вызов FillGeometry. Попытка закешировать кисточки и геометрию привела к обратному результату - время рендеринга увеличилось до 500 мс. Полагаю, я как-то там забил GeometryFactory, наверное, но я не имею представление, что там внутри происходит, могу только видеть внешнее проявление. То есть кеширование кисточек и геометрии не помогает.

Вопрос: почему оно такое медленное? И как это исправить? Явно же не должно всё настолько медленно работать.

Заранее спасибо.

Добавлено через 15 часов 18 минут
Дополнительно погонял код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
   int iterations = 0;
 
                var g = new Orion.GPUBitmap(BitmapGPU.DeviceManager, (Pnt)1500, Orion.BitmapUsageType.RenderTarget);
                g.Drawing.BeginDraw();
                SharpDX.Vector2[] qa = new[] { new Pnt(7, 8), new Pnt(124, 16), new Pnt(101, 193), new Pnt(0, 132) }.ToVector2s().ToArray();
 
                var l = new List<IDisposable>();
 
                SharpDX.Direct2D1.PathGeometry geo = null;
                SharpDX.Direct2D1.Brush br = null;
                for (int j = 0; j < 10000; j++)
                {
                    geo = new SharpDX.Direct2D1.PathGeometry(BitmapGPU.GeometryFactory);
                    br = new Fill(Clr.Red).CreateDirectXBrush(Pnt.Empty | 1500, g.Drawing, BitmapGPU.DeviceManager);
                    l.Add(geo);
                    l.Add(br);
                }
                using (var oro = geo.Open())
                {
                    oro.BeginFigure(Pnt.Empty, SharpDX.Direct2D1.FigureBegin.Filled);
                    oro.AddLines(qa);
                    oro.EndFigure(SharpDX.Direct2D1.FigureEnd.Closed);
                    oro.Close();
                }
 
              
                Time start = Time.Now;
                while (Time.Now - start < 1000)
                {
                    g.Drawing.FillGeometry(geo, br);
                    iterations++;
                }
                foreach (var item in l)
                {
                    item.Dispose();
                }
                //geo.Dispose();
                //br.Dispose();
 
                g.Drawing.EndDraw();
                MessageBox.Show($"Число итераций: {iterations.ToStringWithNumberGroups()}");
                g.Dispose();
То есть мы тупо создаем 10000 кистей и геометрий на одной фабрике, но рисуем только одну из них - действительно, производительность падает в 30(!) раз. Если кистей и геометрий по 1 штуке - тогда за секунду выдает около 75000 итераций. Если их 10000 - то выдает 2500 итераций.

Иными словами, кешировать не получается - если одновременно существует много геометрий, производительность каким-то чудесным образом серьезно падает. Я не понимаю, что это и почему так происходит.
Ответ: Спасибо за совет! Я как раз пытался так делать, но получил оочень странное поведение: при кешировании все не ускоряется, а замедляется. То есть чем больше одновременно создано геометрий и кисточек, тем медленнее отрисовка.

У меня появились мысли, как это обойти (к сожалению, через одно место). Добьюсь результата - отпишусь.
Вопрос: Медленная отрисовка в TImage

Всем привет!

Есть необходимость построить несколько графиков по точкам. Значения хранятся в массивах и их 1 371 648 для каждого графика.

Рисую в TImage, но скорость отрисовки не очень. Пробовал в PaintBox - тоже не быстро.

Рисование одного графика происходит относительно быстро:

примерно 0,2 секунды

Отрисовка второго графика занимает около 20 секунд (от 20 до 30 секунд)


При масштабировании предусмотрено условие, что если координаты текущей точки совпадают с координатами на предыдущем шаге цикла, то этот шаг мы пропускаем, т.к. незачем закрашивать пиксель, который уже закрашен ранее. Это ускорило процесс. Пока писал пост, понял, что было бы неплохо смотреть не только предыдущий пиксель за закраску...

Я думаю, что такая разница в скорости рисования между первым и вторым графиками обусловлена оптимизацией алгоритма рисования в системе. То есть первый график меняется менее динамично, чем второй, и значения в первом массиве могут меняются реже, чем во втором. Но при этом количество значений в обоих массивах одинаковое (1 371 648).

Пробовал рисовать в TBitMap, а потом из BitMap выводить на TImage, но тоже самое получилось по скорости.

Как ускорить отрисовку графиков с таким количеством значений ?
Ответ: Разумеется, я уже забыл, когда что-то под 32 бита делал. Хоть памяти и 2 Гб выделено под ту ВМ - все равно, ОС 64-битная. Плюшек очень много в 64-битной версии, которых нет в 32-х...
Вопрос: Очень медленная компиляция в RAD Builder c++ 2010

В общем что-то переклинило в студии и стало компилить по 2-3 минуты. Проц не грузит. Просто долго скачет по cpp файлам. Но в итоге получаю готовый exe. Кто сталкивался с таким?

Добавлено через 4 часа 39 минут
Разобрался, проблема была в проекте. Не знаю что именно, но я просто взял и переписал все заново.
Ответ:
Сообщение от Micro
стало компилить по 2-3 минуты
А сам проект-то толстый, много модулей всякских?
Вопрос: Создание и запись файла побайтно. Очень нужно :(

Пожалуйста, помогите организовать запись файла побайтно! Весь день сижу ничего не выходит

Есть массив short очень большой. Перебираю его и занимает это уйму времени, до конца не дождаться может и не в этом проблема, не знаю уже ничего!

В общем: массив short как записать так же short числами в файл? бинарный файл, наверное. Осталось несколько часов до сдачи
Ответ: renataakhm, QVector<QString> Это что-то очень странное. Посмотрите что такое контейнеры, вы не понимаете этого. QString - вещь безразмерная, в нее можно добавлять и добавлять, в то время как QVector требует что бы все элементы хранились строго по очереди. В память из-за такого объединения происходит хаос. В случае простейшего добавления нового символа к QString посередине сдвигается вся полностью последовательность QVector после измененного компонента, а в случае, если для сдвига места не хватает - копируется вся последовательность QVector в новое место. Вы уверены, что это то, что вам нужно? Ведь именно это и может занимать уйму времени. Не забывайте, что QString уже сам по себе контейнер и в дополнительных контейнерах не нуждается. QVector<QString> имеет не очень много смысла. Попробуйте лучше использовать либо QStringList, мне кажется лист тут больше подходит, либо заранее выделить для QVector необходимое пространство в памяти.

А вообще я не знаю с чем вообще вы таким там работаете. У меня копирование и обработка на ходу многогигабайтных файлов занимало времени гораздо меньше, чем у вас.
Вопрос: Как перезаписать значения переменых в php файле если их очень много?

Добрый день!
Прошу совета у форумчан, потому что сама не смогла разобраться с такой задачей:

есть файл php в котором записано очень много переменных, к примеру вот так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
$mail = 'myemail@mail.ru';
$demo = 'nodemo';
$test = 'checked';
...
...
$info = 'changed';
$form = 'submit';
$file = 'read';
 
?>
и форма в которой вводятся новые значения для из этих переменных.

Вопрос: как заменить старые значения в файле на новые, если например были введены не все новые, а только несколько?
Ответ:
Сообщение от Marinka92
Xenox, нужно именно для php файла...
Хм, что то я не могу придумать ситуацию когда требуется очень много переменных хранить в файле... За исключением каких нибудь конфигов или языковых файлов, но это явно не ваш случай, а на счет конфигов, я не думаю что там очень много переменных будет, и они будут меняться динамически. Хотя хз Расскажите зачем вам хранить переменные в файле? Просто интересно
Вопрос: Класс очень больших чисел

Добрый день!

В универе нам задали следующее задание: создайте методы для арифметических действий на числами класса verylong (порядок чисел < 10000). Перегрузите соответствтующие операции. Числа могут быть как положительные, так и отрицательные. Также перегрузите операции сравнения долгих чисел.

И дан код-образец, который нужно модифицировать:

Код

// verylong.h
// описатель класса сверхбольших целых чисел
#include <iostream>
#include <string.h> // для strlen()и т. п.
#include <stdlib.h> // для ltoa()
using namespace std;
const int SZ = 1000; // максимальное число разрядов
class verylong
{
private:
char vlstr[SZ]; // число как строка
int vlen; // длина строки verylong
verylong multdigit(const int) const; // прототипы
verylong mult10(const verylong) const;// скрытых
// функций
public:
verylong() : vlen(0) // конструктор без аргументов
{ vlstr[0] = '\0'; }
verylong(const char s[SZ]) // конструктор (1 аргумент)
{ strcpy(vlstr, s); vlen = strlen(s); } // для строки
verylong(const unsigned long n) // конструктор (1 арг.)
{ // для long int
ltoa(n, vlstr, 10); // перевести в строку
strrev(vlstr); // перевернуть ее
vlen = strlen(vlstr); // найти длину
}
void putvl() const; // вывести число
void getvl(); // получить число от пользователя
verylong operator+(const verylong); // сложить числа
verylong operator*(const verylong); // умножить
};


Код

// verylong.cpp
// реализация обработки данных типа verylong
#include "verylong.h" // заголовочный файл для verylong
//---------------------------------------------------------
void verylong::putvl() const // вывод на экран verylong
{
char temp[SZ];
strcpy(temp, vlstr); // создать копию
cout << strrev(temp); // перевернуть копию
} // и вывести ее
//---------------------------------------------------------
void verylong::getvl() // получить сверхбольшое число от
// пользователя
{
cin >> vlstr; // получить строку от пользователя
vlen = strlen(vlstr); // найти ее длину
strrev(vlstr); // перевернуть ее
}
//---------------------------------------------------------
verylong verylong::operator+(const verylong v)
// сложение
{
char temp[SZ];
int j;
// найти самое длинное число
int maxlen = (vlen > v.vlen) ? vlen : v.vlen;
int carry = 0; // установить в 1, если сумма >= 10
for(j = 0; j < maxlen; j++) // и так для каждой позиции
{
int d1 = (j > vlen - 1) ? 0 : vlstr[j]-'0'; // получить
// разряд
int d2 = (j > v.vlen - 1) ? 0 : v.vlstr[j]-'0';// и еще
int digitsum = d1 + d2 + carry; // сложить разряды
if(digitsum >= 10) // если перенос, то
{ digitsum -= 10; carry = 1; } // увеличить сумму на 10
else // установить перенос в 1
carry = 0; // иначе перенос = 0
temp[j] = digitsum + '0';// вставить символ в строку
}
if(carry == 1) // если перенос в конце,
temp[j++] = '1'; // последняя цифра = 1
temp[j] = '\0'; // поставить ограничитель строки
return verylong(temp); // вернуть временный verylong
}
//---------------------------------------------------------
verylong verylong::operator*(const verylong v)// умножение
{ // сверхбольших чисел
verylong pprod; // произведение одного разряда
verylong tempsum; // текущая сумма
for(int j = 0; j < v.vlen; j++)// для каждого разряда аргумента
{
int digit = v.vlstr[j]-'0'; // получить разряд
pprod = multdigit(digit); // умножить текущий на него
for(int k = 0; k < j; k++) // умножить результат на
pprod = mult10(pprod); // степень 10-ти
tempsum = tempsum + pprod; // прибавить произведение к
// текущей сумме
}
return tempsum; // вернуть полученную текущую сумму
}
//---------------------------------------------------------
verylong verylong::mult10(const verylong v) const // умножение аргумента
// на 10
{
char temp[SZ];
for(int j = v.vlen - 1; j >= 0; j--)// сдвинуться на один разряд
temp[j + 1] = v.vlstr[j]; // выше
temp[0] = '0'; // обнулить самый младший разряд
temp[v.vlen + 1] = '\0'; // поставить ограничитель строки
return verylong(temp); // вернуть результат
}
//---------------------------------------------------------
verylong verylong::multdigit(const int d2) const
{ // умножение числа на
char temp[SZ]; // аргумент (цифру)
int j, carry = 0;
for(j = 0; j < vlen; j++) // для каждого разряда
{ // в этом сверхбольшом
int d1 = vlstr[j]-'0'; // получить значение разряда
int digitprod = d1 * d2; // умножить на цифру
digitprod += carry; // добавить старый перенос
if(digitprod >= 10) // если возник новый перенос,
{
carry = digitprod / 10; // переносу присвоить значение старшего разряда
digitprod -= carry * 10;// результату - младшего
}
else
carry = 0; // иначе перенос = 0
temp[j] = digitprod + '0';// вставить символ в строку
}
if(carry != 0) // если на конце перенос,
temp[j++] = carry + '0'; // это последний разряд
temp[j] = '\0'; // поставить ограничитель
return verylong(temp); // вернуть сверхбольшое число
}


Код

// vl_app.cpp
// вычисляет факториалы больших чисел
#include "verylong.h" // заголовочный файл verylong
int main()
{
unsigned long numb, j;
verylong fact = 1; // инициализировать verylong
cout << "\n\nВведите число: ";
cin >> numb; // ввод числа типа long int
for(j = numb; j > 0; j--)// факториал — это numb *
fact = fact * j; // numb-1 * numb-2 *
cout << "Факториал = "; // numb-3 и т. д.
fact.putvl(); // вывести значение факториала
cout << endl;
return 0;
}


Помогите, пожалуйста, решить задачу! Буду очень благодарна за помощь!

Это сообщение отредактировал(а) LittleMonkey - 25.5.2015, 12:53
Ответ:
Добрый день!

В универе нам задали следующее задание: создайте методы для арифметических действий на числами класса verylong (порядок чисел < 10000). Перегрузите соответствтующие операции. Числа могут быть как положительные, так и отрицательные. Также перегрузите операции сравнения долгих чисел.

И дан код-образец, который нужно модифицировать:

Код

// verylong.h
// описатель класса сверхбольших целых чисел
#include <iostream>
#include <string.h> // для strlen()и т. п.
#include <stdlib.h> // для ltoa()
using namespace std;
const int SZ = 1000; // максимальное число разрядов
class verylong
{
private:
char vlstr[SZ]; // число как строка
int vlen; // длина строки verylong
verylong multdigit(const int) const; // прототипы
verylong mult10(const verylong) const;// скрытых
// функций
public:
verylong() : vlen(0) // конструктор без аргументов
{ vlstr[0] = '\0'; }
verylong(const char s[SZ]) // конструктор (1 аргумент)
{ strcpy(vlstr, s); vlen = strlen(s); } // для строки
verylong(const unsigned long n) // конструктор (1 арг.)
{ // для long int
ltoa(n, vlstr, 10); // перевести в строку
strrev(vlstr); // перевернуть ее
vlen = strlen(vlstr); // найти длину
}
void putvl() const; // вывести число
void getvl(); // получить число от пользователя
verylong operator+(const verylong); // сложить числа
verylong operator*(const verylong); // умножить
};


Код

// verylong.cpp
// реализация обработки данных типа verylong
#include "verylong.h" // заголовочный файл для verylong
//---------------------------------------------------------
void verylong::putvl() const // вывод на экран verylong
{
char temp[SZ];
strcpy(temp, vlstr); // создать копию
cout << strrev(temp); // перевернуть копию
} // и вывести ее
//---------------------------------------------------------
void verylong::getvl() // получить сверхбольшое число от
// пользователя
{
cin >> vlstr; // получить строку от пользователя
vlen = strlen(vlstr); // найти ее длину
strrev(vlstr); // перевернуть ее
}
//---------------------------------------------------------
verylong verylong::operator+(const verylong v)
// сложение
{
char temp[SZ];
int j;
// найти самое длинное число
int maxlen = (vlen > v.vlen) ? vlen : v.vlen;
int carry = 0; // установить в 1, если сумма >= 10
for(j = 0; j < maxlen; j++) // и так для каждой позиции
{
int d1 = (j > vlen - 1) ? 0 : vlstr[j]-'0'; // получить
// разряд
int d2 = (j > v.vlen - 1) ? 0 : v.vlstr[j]-'0';// и еще
int digitsum = d1 + d2 + carry; // сложить разряды
if(digitsum >= 10) // если перенос, то
{ digitsum -= 10; carry = 1; } // увеличить сумму на 10
else // установить перенос в 1
carry = 0; // иначе перенос = 0
temp[j] = digitsum + '0';// вставить символ в строку
}
if(carry == 1) // если перенос в конце,
temp[j++] = '1'; // последняя цифра = 1
temp[j] = '\0'; // поставить ограничитель строки
return verylong(temp); // вернуть временный verylong
}
//---------------------------------------------------------
verylong verylong::operator*(const verylong v)// умножение
{ // сверхбольших чисел
verylong pprod; // произведение одного разряда
verylong tempsum; // текущая сумма
for(int j = 0; j < v.vlen; j++)// для каждого разряда аргумента
{
int digit = v.vlstr[j]-'0'; // получить разряд
pprod = multdigit(digit); // умножить текущий на него
for(int k = 0; k < j; k++) // умножить результат на
pprod = mult10(pprod); // степень 10-ти
tempsum = tempsum + pprod; // прибавить произведение к
// текущей сумме
}
return tempsum; // вернуть полученную текущую сумму
}
//---------------------------------------------------------
verylong verylong::mult10(const verylong v) const // умножение аргумента
// на 10
{
char temp[SZ];
for(int j = v.vlen - 1; j >= 0; j--)// сдвинуться на один разряд
temp[j + 1] = v.vlstr[j]; // выше
temp[0] = '0'; // обнулить самый младший разряд
temp[v.vlen + 1] = '\0'; // поставить ограничитель строки
return verylong(temp); // вернуть результат
}
//---------------------------------------------------------
verylong verylong::multdigit(const int d2) const
{ // умножение числа на
char temp[SZ]; // аргумент (цифру)
int j, carry = 0;
for(j = 0; j < vlen; j++) // для каждого разряда
{ // в этом сверхбольшом
int d1 = vlstr[j]-'0'; // получить значение разряда
int digitprod = d1 * d2; // умножить на цифру
digitprod += carry; // добавить старый перенос
if(digitprod >= 10) // если возник новый перенос,
{
carry = digitprod / 10; // переносу присвоить значение старшего разряда
digitprod -= carry * 10;// результату - младшего
}
else
carry = 0; // иначе перенос = 0
temp[j] = digitprod + '0';// вставить символ в строку
}
if(carry != 0) // если на конце перенос,
temp[j++] = carry + '0'; // это последний разряд
temp[j] = '\0'; // поставить ограничитель
return verylong(temp); // вернуть сверхбольшое число
}


Код

// vl_app.cpp
// вычисляет факториалы больших чисел
#include "verylong.h" // заголовочный файл verylong
int main()
{
unsigned long numb, j;
verylong fact = 1; // инициализировать verylong
cout << "\n\nВведите число: ";
cin >> numb; // ввод числа типа long int
for(j = numb; j > 0; j--)// факториал — это numb *
fact = fact * j; // numb-1 * numb-2 *
cout << "Факториал = "; // numb-3 и т. д.
fact.putvl(); // вывести значение факториала
cout << endl;
return 0;
}


Помогите, пожалуйста, решить задачу! Буду очень благодарна за помощь!

Это сообщение отредактировал(а) LittleMonkey - 25.5.2015, 12:53