Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
1

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

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

Author24 — интернет-сервис помощи студентам
Ниже приведен код программы, вычисляющей по заданному 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2011, 17:32
Ответы с готовыми решениями:

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

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

Strftime некорректная работа
Ввожу дату/время в виде строки &quot;YYYY-MM-DD HH:MM&quot; и вывожу через strftime, а также для проверки...

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

17
42 / 42 / 13
Регистрация: 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;
}
1
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 17:46  [ТС] 3
К сожалению, это не помогло. По-прежнему выдаются те же самые левые результаты.
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
10.05.2011, 17:53 4
А большие числа? Может имеет смысл
C++
1
unsigned long a,s=1;
1
Эксперт С++
1069 / 848 / 60
Регистрация: 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.
1
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 17:59  [ТС] 6
Я проверял небольшие значения (от 3 до 5), т.к. этого вполне достаточно. В случае с unsigned long ошибка та же.
Пробовал запускать в turbo c++ 3.1, а также в Dev-с++.
0
Higher
1953 / 1219 / 120
Регистрация: 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;
}
0
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 18:08  [ТС] 8
diagon, спасибо, но при написании программы у меня была цель научиться использовать цикл for. Поэтому меня интересует возможно более короткое решение, а также причина, по которой программа, приведенная мной в 1 посте, отказывается работать.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.05.2011, 18:09 9
В 1 посте j никогда бы не достигла а, т.к. шаг у j был 1, а при этом умножалось на j. Лично у меня это бесконечный цикл...
0
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 18:13  [ТС] 10
diagon, почему не достигла бы? Насколько я понимаю, цикл работает, пока j не равно a. После достижения этого значения он перестает выполняться...
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
10.05.2011, 18:13 11
Цитата Сообщение от dmital Посмотреть сообщение
diagon, спасибо, но при написании программы у меня была цель научиться использовать цикл for. Поэтому меня интересует возможно более короткое решение, а также причина, по которой программа, приведенная мной в 1 посте, отказывается работать.
Для for вам предложили рабочий вариант во 2 ответе.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.05.2011, 18:14 12
Да, вы правильно понимаете, но вот проблемка... В цикле вы увеличиваете значение а в j раз, а j при этом только увеличиваете на одну... Поэтому а возрастает быстрее чем j
1
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
10.05.2011, 18:17 13
Цитата Сообщение от diagon Посмотреть сообщение
Да, вы правильно понимаете, но вот проблемка... В цикле вы увеличиваете значение а в j раз, а j при этом только увеличиваете на одну... Поэтому а возрастает быстрее чем j
Вы помните как факториал вычисляется? Код скопируйте целиком и проверьте =)
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.05.2011, 18:19 14
Да я то помню, в конце 1й страницы моя реализация длинного факториала лежит...
Я проверял у себя, просто бесконечный цикл. Как у топикстартера что-то выводит, да еще и отрицательное, ума не приложу
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
10.05.2011, 18:22 15
Ой, мы про разные вещи говорим. Я про код, приведённый в ответе тут
0
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
10.05.2011, 18:23  [ТС] 16
diagon, спасибо, я понял.

Программа из второго поста заработала в обеих средах.
Благодарю всех за помощь.
0
В вечном поиске...
275 / 235 / 30
Регистрация: 05.04.2011
Сообщений: 645
10.05.2011, 18:28 17
Попробуйте вот так-с:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<conio.h>
int main()
{
int i;
float n,s;
clrscr();
printf("n=");
scanf("%f",&n);
s=1;
for(i=1;i<=n;i++)
s*=i;
printf("s=%16.0f",s);
getch();
}
Добавлено через 1 минуту
И еще, у вас в цикле J было не равно а.
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
11.05.2011, 19:26 18
Цитата Сообщение от dmital Посмотреть сообщение
Я проверял небольшие значения (от 3 до 5), т.к. этого вполне достаточно. В случае с unsigned long ошибка та же.
Пробовал запускать в turbo c++ 3.1, а также в Dev-с++.
Ошибка-то почти классическая!
C++
1
2
for int j = 1; j != a; j++)
a *= j;
Посмотри на условие окончания цикла. Переменная а в цикле увеличивается, и ты j сравниваешь все время не с первоначальным значением, а с умноженным. В разных средах получается по-разному. У меня всегда нулями дело заканчивалось в CodeBlocks.
0
11.05.2011, 19:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2011, 19:26
Помогаю со студенческими работами здесь

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

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

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

некорректная работа программы
В файлах, которые генирируются со случайными выдает всякую чушь using namespace std; int main()...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru