С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 784

Ошибка в цикле

03.09.2015, 11:29. Показов 1492. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Нужно вычислить факториал неотрицательного числа. К примеру:
n! = n * (n - 1) * (n - 2) * ... (для значений n > 1)
n! = 1 (для n = 0 or n = 1)
For example:
5! = 5 * 4 * 3 * 2 * 1; 5! == 120;
У меня выводит 80. Полагаю, что ошибка в цикле. Но где она?
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
int n;
    int i = 1; // (n - i)
    int f;
    int total = 0;
 
    cout << "Enter the number: ";
    cin >> n;
 
    f = n; 
 
    while (n > 0)
    {
        if (f == n)
        {
            f = f * (n - i);
            i++;
            n--;
        }
        else
            if (n < f)
        {
            total = f * (n - i);
            i++;
            n--;
        }
    }
 
    cout << total;
Добавлено через 3 минуты
i декрементирую - ошибка. Сейчас исправлю и посмотрю.

Добавлено через 1 минуту
Если сделать
C++
1
i++;
что вполне логично, ответ вообще -80

Добавлено через 7 минут
Здесь, наверное, не так:
C++
1
total = f * (n - i);
а так?
C++
1
total = total + f * (n - i);
Добавлено через 1 минуту

Не по теме:

Запутался.. В общем, жду людей поумнее чем я.

0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2015, 11:29
Ответы с готовыми решениями:

Ошибка в цикле
Суть задачи: Разработать программу для приближенного вычисления величины y=Ʃ(1/((2*n+1)*(2*n-1))) , n=1,2,3,... Процесс...

Ошибка в цикле
Задание: Написать цикл программы. от К=1 до К=10 #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main () ...

Ошибка в цикле
Суть программы: создаёт динамический список, каждый новый элемент списка заносится в конец. Ну, там далее ещё функций по мелочи, но не...

7
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
03.09.2015, 11:32
А не проще с помощью массива?
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
03.09.2015, 11:33
C++
1
2
3
4
5
int factor(int x){
   int n = 1;
   for (int i = 2; i <= x; ++i) n *= i;
   return n;
}
А у Вас что-то совсем не то.
1
 Аватар для kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 784
03.09.2015, 11:36  [ТС]
Цитата Сообщение от Senarist Посмотреть сообщение
А не проще с помощью массива?
Не проходил массивы еще, нужно с циклом while делать.
FraidZZ, а можете циклом while написать? Чтоб мне более понятно было.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.09.2015, 11:38
Лучший ответ Сообщение было отмечено kalonord как решение

Решение

здесь
Цитата Сообщение от kalonord Посмотреть сообщение
total = total * (n - i);
и здесь
Цитата Сообщение от kalonord Посмотреть сообщение
i++; n--;
множитель факториала фактически два раза подряд уменьшается на 1
Выберите что-то одно:
например
C++
1
2
3
4
5
while (n > 0)
    {
            total = total  * (n - i);
            i++;
    }
1
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
03.09.2015, 11:39
C++
1
2
3
4
5
6
7
int fakt(int n)
{
   int f=1;
   while (n>1)
      f*=n--; 
   return f;
}
1
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
03.09.2015, 11:55
Пример отсюда
C++
1
2
3
4
5
6
  int factorial(int n) {
    if (n < 0 ) {
        return 0;
    }
      return !n ? 1 : n * factorial(n - 1);
  }
Добавлено через 14 минут
kalonord, с while
C++
1
2
3
4
5
6
7
8
int factorial(int x){
    int ans = 1;
    while (x > 0) {
        ans *= x;
        x--;
    }
    return ans;
}
0
 Аватар для kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 784
03.09.2015, 14:12  [ТС]
Всем спасибо.
Kuzia domovenok, Вам отдельное. Не знаю почему я вообще декрементировал постоянно n, по формуле ведь всё видно.
В итоге написал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int n;
    int i = 0; // (n - i)
    int f;
 
    cout << "Enter the number: ";
    cin >> n;
 
    f = n;
 
    while (i < n - 1)
    {
            f *= (n - ++i);
    }
Добавлено через 1 час 29 минут
Напишите программу, которая приближенно вычисляет значение математической константы e, используя формулу:
e=1+ 1/1! + 1/2! + 1/3!
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
double e;  // need to find it
    double total = 0;
    int items; // how many items of number?
    int i = 0;
    int f;
    int n = 1;
 
    cout << "Enter number of items: ";
    cin >> items; // for example, 5
 
    while (items)
    {
        f = n;
 
        if (n == 0 || n == 1)
        {
            f = 1;
        }
        else
        {
            while (i < n - 1)
            {
                f *= (n - ++i);
            }
        }
 
        total += 1.0 / f;
        n++;
        i = 0;
 
        items--;
    }
 
    e = 1 + total;
Вроде правильно решил, мб понадобится кому.

Кстати, вопрос на счёт строки:
C++
1
total += 1.0 / f;
Так можно делать или лучше объявлять переменную f типом double?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.09.2015, 14:12
Помогаю со студенческими работами здесь

Ошибка в цикле while
Привет всем! Ниже приведен код программы, в программе две функции одна change() переводит Ф.И.О в формат фамилия - инициалы, а вторая...

Ошибка в цикле while
//--------------------------------------------------------------------------- #pragma hdrstop #include &lt;locale&gt; #include &lt;stdio.h&gt; ...

Ошибка в цикле
Помогите найти ошибку в цикле, пожалуйста #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; #include...

Ошибка в цикле
(Задание - см. вложение) Почему функция fill_array() возвращает неправильные значения? Когда ввожу 1 или 2 числа, выводит цифру 1;...

Ошибка в цикле
Хочу создать массив из 10 чисел. void main() { char a,i; for (i=0; i&lt;10; i++) { printf...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru