Форум программистов, компьютерный форум CyberForum.ru

Разбор алгоритма программы - C++

Восстановить пароль Регистрация
 
SuperSven
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 3
11.02.2014, 17:52     Разбор алгоритма программы #1
Здравствуйте, у меня есть программа, вычисляющая факториал заданного числа.

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
#include "stdafx.h"
#include <iostream>
 
 
 
using namespace std;
int a[1000],i,n,j,ost=0,num=1,c;
 
int main(){
    cin>>n;
    memset(a,0,sizeof(a));
    if(n==0 || n==1) {cout<<1; return 0;}
    a[0]=1;
    for(i=2;i<=n;i++){
        for(j=0;j<num;j++){
            c=(a[j]*i+ost);
            a[j]=c%1000;
            ost=c/1000;
 
        }
        a[num]=ost%1000;
        ost/=1000;
        a[num+1]=ost%1000;
        ost/=1000;
        a[num+2]=ost;
        ost=0;
        if(a[num+1]!=0)num+=2;
        else if(a[num]!=0)num++;
    
    }
    cout<<a[num-1];
    for(i=num-2;i>=0;i--) {
        if(a[i]>99) cout<<a[i];
        else {
            if (a[i]>9) {cout<<0<<a[i];}
            else cout<<'0'<<'0'<<a[i];
        }
    }
return 0;
}
Помогите разобраться с алгоритмом. Сначала все понятно, идет обычное вычисление факториала. Но если результат получается больше 1000, то он получается некорректный. Для исправления этого и написана эта часть:
Кликните здесь для просмотра всего текста
a[num]=ost%1000;
ost/=1000;
a[num+1]=ost%1000;
ost/=1000;
a[num+2]=ost;
ost=0;
if(a[num+1]!=0)num+=2;
else if(a[num]!=0)num++;

Но я не совсем понимаю, как она работает. И почему результат свыше 1000 получается некорректный? И вывод какой-то мудреный. Заранее благодарю за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2014, 17:52     Разбор алгоритма программы
Посмотрите здесь:

Разбор кода программы C++
Разбор кода простой программы новичка C++
Разбор программы C++
разбор программы C++
C++ разбор программы
Разбор алгоритма C++
C++ Разбор алгоритма программы
C++ Разбор кода программы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
11.02.2014, 18:06     Разбор алгоритма программы #2
Вот так обычно ищут факториал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
unsigned long long fact(int n)
{
      if(n < 0) 
        return 0; 
      if (n == 0 || n == 1) 
        return 1; 
      else 
        return n * fact(n - 1); 
}
 
int main()
{
  std::cout << fact(20) << std::endl;
  
  system("PAUSE");
  return 0;
}
И почему результат свыше 1000 получается некорректный?
потому что число которое получается очень большое.(посмотрите пример с факт(20)) и видимо кто то пытался разбить это число на меньшие и сохранить в массиве.
Вопрос: вам дали задание найти факториал 1000 ?, если нет не заморачивайтесь.
SuperSven
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 3
11.02.2014, 18:12  [ТС]     Разбор алгоритма программы #3
Цитата Сообщение от egor2116 Посмотреть сообщение
Вопрос: вам дали задание найти факториал 1000 ?, если нет не заморачивайтесь.
Нет, вы немного не так поняли, 1000 это не сам факториал, а результат его. Например факториал 6 = 720, этот результат программа нормально выводит, а вот если уже 7 = 5040, то значения неверные получаются без того куска.
Мне дали задание просто описать алгоритм.
Yandex
Объявления
11.02.2014, 18:12     Разбор алгоритма программы
Ответ Создать тему
Опции темы

Текущее время: 19:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru