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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
#1

Некорректная работа цикла for. - C++

10.05.2011, 17:32. Просмотров 782. Ответов 17
Метки нет (Все метки)

Ниже приведен код программы, вычисляющей по заданному n значение n!. Прошу объяснить, почему программа выдает отрицательные числа порядка -10000 (результат не превышает 30000, и может быть выведен типом int). К сожалению, не нашел подобных тем на форуме, поэтому пришлось создать свою.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream.h>
using namespace std;
int main() {
int a;
cin>>a;
for (int j=1; j!=a; j++)
    a*=j;
cout<<a<<endl;
system("Pause");
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2011, 17:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Некорректная работа цикла for. (C++):

Некорректная работа программы - C++
Добрый день! Я попытался решить задачу № 5 &quot;Статистика&quot; с сайта acmp.ру. Текст задачи: Вася не любит английский язык, но каждый...

Некорректная работа программы - C++
Суть программы в том, что есть записанные в файле слова с ответами (разделены &quot;\t\t&quot;). Программа считывает поочереди строки, разделяет ее...

Некорректная работа rand() - C++
В общем вот кусок кода и картинкой его реализация: #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; ...

Некорректная работа программы - C++
Помогите, пожалуйста, понять почему не работает программа. Ввод предложения работает, однако после нажатия клавиши Enter инвертированный...

Некорректная работа компилятора - C++
простая схема для метода пузырькового упорядочения /* * Проект 4-1. Метод пузырькового * упорядочения. */ #include...

Некорректная работа _getch() - C++
При очень быстром нажатии двух клавиш подряд _getch() ловит два символа. И за-за этого программа работает нестабильно. Это фиксится?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
10.05.2011, 17:38 #2
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main() {
int a,s=1;
cin>>a;
for (int j=1; j<=a; j++)
    s*=j;
cout<<s<<endl;
system("Pause");
return 0;
}
dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 17:46  [ТС] #3
К сожалению, это не помогло. По-прежнему выдаются те же самые левые результаты.
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
10.05.2011, 17:53 #4
А большие числа? Может имеет смысл
C++
1
unsigned long a,s=1;
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.05.2011, 17:53 #5
Цитата Сообщение от dmital Посмотреть сообщение
Ниже приведен код программы, вычисляющей по заданному n значение n!. Прошу объяснить, почему программа выдает отрицательные числа порядка -10000 (результат не превышает 30000, и может быть выведен типом int). К сожалению, не нашел подобных тем на форуме, поэтому пришлось создать свою.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream.h>
using namespace std;
int main() {
int a;
cin>>a;
for (int j=1; j!=a; j++)
    a*=j;
cout<<a<<endl;
system("Pause");
return 0;
}
1.В какой системе работаешь?
2. Пусть a = 5. Тогда получаем: 5*1=5, 5*2=10, 10*3 = 30, 30*4 = 120. 5! = 120.
10! > 3600000, 14! > INT_MAX.
dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 17:59  [ТС] #6
Я проверял небольшие значения (от 3 до 5), т.к. этого вполне достаточно. В случае с unsigned long ошибка та же.
Пробовал запускать в turbo c++ 3.1, а также в Dev-с++.
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.05.2011, 18:02 #7
Попробуй так=)
Можешь значения побольше вводить, 1000 например
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
void readlong(std::vector<int> &a); //чтение
void writelong(std::vector<int> a){  //вывод
        for (size_t i=0; i< a.size();i++) std::cout << a[i];}
short compare(std::vector<int> a,std::vector<int> b); //сравнение
void nol(std::vector<int> &a,std::vector<int> &b); //добавление нулей в начало(для суммы)
std::vector<int> sum(std::vector<int> a, std::vector <int> b); //сумма
std::vector<int> smult(std::vector<int> a,int b); //умножение длинного на короткое
void ten(std::vector<int> &a,int b);//добавление b нулей в конец
long long vectoint(std::vector<int> a);//перевод вектора в int
std::vector<int> mult (std::vector<int> a, std::vector<int> b); //умножение длинного на длинное
std::vector<int> factorial(std::vector<int> b); //факториал
int main(){
        std::vector<int> a;
        readlong(a);
        writelong(factorial(a));
        return 0;
}
void readlong(std::vector<int> &a){
        std::string s;
        std::cin >> s;
        for (std::string::iterator i = s.begin(); i < s.end(); i++) 
        a.push_back(*i-48);
}
short compare(std::vector<int> a,std::vector<int> b){
        if (a.size()>b.size()) return 1;
        if (a.size()<b.size()) return 2;
        for (size_t i=0; i<a.size();i++){
        if (a[i]>b[i]) return 1;
        if (a[i]<b[i]) return 2;
        }
        return 0;
 
}
void nol(std::vector<int> &a,std::vector<int> &b){
        if (a.size()==b.size()) return;
        if (a.size()>b.size()) std::swap(a,b);
        for (size_t i=0; i< a.size()-b.size(); i++){
                a.insert(a.begin(),0);
        }
}
std::vector<int> sum(std::vector<int> a, std::vector<int> b){
        std::vector<int>c;
        short p=0;
        nol(a,b);
        c.assign(a.size(),0);
        for (short i = a.size()-1; i >= 0; i--) {
                c[i]=a[i]+b[i]+p;
                p=0;
                if (c[i]>9) {c[i]-=10; p=1;}
        }
        if (p) c.insert(c.begin(),1);
        return c;
}
std::vector<int> smult(std::vector<int> a,int b){
        std::vector<int> c;
        if (!b||!a[0]) {c.push_back(0); return c; }
        for (size_t i = 0; i <a.size(); i++) {
                if (i==c.size()) c.push_back(0);
                c[i]=a[i]*b;
        }
        for (size_t i=c.size()-1; i > 0; i--) {
                if (c[i]>9) {
                        c[i-1]+=c[i]/10;
                        c[i]%=10;
                        }
                }
        if (c[0]<10) return c;
        short p=c[0];
        c[0]%=10;
        for(;;){
                if (!(p/10)) break;
                c.insert(c.begin(),p/10);
                p/=10;
        }
        return c;
}
void ten(std::vector<int>& a,int b){
        for (; b; b--)
                a.push_back(0);
}
std::vector<int> factorial(std::vector<int>(b)){
        std::vector<int> a,o,c;
        a.push_back(1);
        o.push_back(1);
        c.push_back(1);
        for(long int i=0;i<vectoint(b)-1;i++){
                c=sum(c,o);
                a=mult(c,a);
        }
        return a;
}
long long vectoint(std::vector<int> a){
        long long c=0,q=1;
        for (short i = a.size()-1; i >=0; i--) {
                c+=a[i]*q;
                q*=10;
        }
        return c;
}
std::vector<int> mult (std::vector<int> a, std::vector<int> b)
{
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        std::vector<int> c(a.size()+b.size());
        for (int i = 0; i < a.size(); ++i)
                for (int j = 0, carry = 0; j < b.size() || carry; ++j)
                {
                        long long cur = c[i+j] + a[i] * (j < b.size() ? b[j] : 0) + carry;
                        c[i+j] = cur % 10;
                        carry = cur / 10;
                }
 
        while (c.size() > 1 && c.back() == 0)
                c.pop_back();
                reverse(c.begin(),c.end());
                return c;
}
dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 18:08  [ТС] #8
diagon, спасибо, но при написании программы у меня была цель научиться использовать цикл for. Поэтому меня интересует возможно более короткое решение, а также причина, по которой программа, приведенная мной в 1 посте, отказывается работать.
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.05.2011, 18:09 #9
В 1 посте j никогда бы не достигла а, т.к. шаг у j был 1, а при этом умножалось на j. Лично у меня это бесконечный цикл...
dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 18:13  [ТС] #10
diagon, почему не достигла бы? Насколько я понимаю, цикл работает, пока j не равно a. После достижения этого значения он перестает выполняться...
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
10.05.2011, 18:13 #11
Цитата Сообщение от dmital Посмотреть сообщение
diagon, спасибо, но при написании программы у меня была цель научиться использовать цикл for. Поэтому меня интересует возможно более короткое решение, а также причина, по которой программа, приведенная мной в 1 посте, отказывается работать.
Для for вам предложили рабочий вариант во 2 ответе.
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.05.2011, 18:14 #12
Да, вы правильно понимаете, но вот проблемка... В цикле вы увеличиваете значение а в j раз, а j при этом только увеличиваете на одну... Поэтому а возрастает быстрее чем j
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
10.05.2011, 18:17 #13
Цитата Сообщение от diagon Посмотреть сообщение
Да, вы правильно понимаете, но вот проблемка... В цикле вы увеличиваете значение а в j раз, а j при этом только увеличиваете на одну... Поэтому а возрастает быстрее чем j
Вы помните как факториал вычисляется? Код скопируйте целиком и проверьте =)
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.05.2011, 18:19 #14
Да я то помню, в конце 1й страницы моя реализация длинного факториала лежит...
Я проверял у себя, просто бесконечный цикл. Как у топикстартера что-то выводит, да еще и отрицательное, ума не приложу
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
10.05.2011, 18:22 #15
Ой, мы про разные вещи говорим. Я про код, приведённый в ответе тут
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2011, 18:22
Привет! Вот еще темы с ответами:

Некорректная работа cin.getline() - C++
Доброго времени суток,господа знатоки. у меня есть двумерный массив char куда мне нужно записать строки и отсортировать но вот в чем...

Шаблон функции. Некорректная работа - C++
Здравствуйте. Проблема такая: ниже приведенный код почему то некорректно отображает вызовы со всеми последующими массивами после float в...

Некорректная работа функции pow - C++
Доброго времени суток. задали в универе написать прогу которая решала б кубическое уравнение.В расчетных формулах использовал функцию pow...

Некорректная работа функции fscanf - C++
Пишу прогу. Нужно считать из файла данные. Читаю при помощи fscanf. В итоге прога вроде работает, а вот в переменной куда считываю...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.05.2011, 18:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru