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

Найти ошибку в цикле - C++

Восстановить пароль Регистрация
 
Georgg
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 37
07.09.2014, 10:59     Найти ошибку в цикле #1
Помогите найти ошибку в цикле.Не циклирует.

Кликните здесь для просмотра всего текста
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL,"Russian");
 
char quit;
do{    
      
       unsigned long int M(1),m(0);
       int p(0),k(0),n(0),l(0),s(0);
 
 
       for (int i=2;i<=31;++i)
        {
            for (int j=2;j<=31;++j)
                {
                    p=i%j;
                    p==0?k++:k==k;
                    if(j==31 && k==1)
                        {
                           for (int n(1);n<=i;n++)
                                {
                                    M*=2;
                                    n==i?M-=1:M==M;
                                }  
                           for (m=2;m<=M;m++)
                                {
                                    l=M%m; 
                                    l==0?s++:s==s;
                                }
                           if(s==1) cout << "   Число Мерсена(2^"<<i<<"-1) при значении "<< M <<" НЕ является простым числом.   "<<endl;
                           else cout << "   Число Мерсена(2^"<<i<<"-1) при значении "<< M <<" является простым числом.  "<<endl;
                        }
                    else continue;
                }
          }
    cout << "Продолжить (y/n)?"<<endl;
    }while(cin>>quit && quit=='y');
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2014, 10:59     Найти ошибку в цикле
Посмотрите здесь:

C++ Не могу понять ошибку в цикле for
C++ Массивы. Найти среднее арифметическое элементов массива, расположенных до максимального элемента (найти ошибку в задании)
Найти ошибку в цикле C++
C++ В строках матрицы с отрицательным элементом на главной диагонали найти наибольший из всех элементов (найти ошибку в коде)
C++ Замена слов в цикле. Найти недочеты в коде
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,215
Завершенные тесты: 1
07.09.2014, 11:17     Найти ошибку в цикле #2
Попрбуйте так
C++
1
 }while( (cin>>quit).get() && quit=='y');
Причина в том, что в потоке кроме символа y находится символ "конец строки".
Его надо пропустить. Используем для этого метод get().
Melg
418 / 154 / 62
Регистрация: 23.09.2013
Сообщений: 306
07.09.2014, 11:18     Найти ошибку в цикле #3
Здравствуйте, Вы могли бы более подробно описать, какое поведение программы Вы ожидали, и что в реальном поведении не соответствует Вашим ожиданиям?
Запустив программу я получил вывод

Число Мерсена(2^2-1) при значении 3 НЕ является простым числом.
Продолжить (y/n)?

При нажатии y - повторяет сообщение, при n - выходит из программы.
Запускал из под терминала Ubuntu.
Georgg
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 37
07.09.2014, 11:31  [ТС]     Найти ошибку в цикле #4
Задача звучит так : Числа вида 2^p-1,где p-простое число,называются числами М.Мерсенна. Являются ли числа Мерсенна при значении p равным 2,3,5,7,11,13,17,19,23,29,31,простыми?

Добавлено через 5 минут
Программа проверяет числа от 2 до 31 простое или нет,если простое то возводит 2 в степень простого числа и вычитается 1 и опять проверяет возведённое число на простоту

Добавлено через 1 минуту
Причина в том, что в потоке кроме символа y находится символ "конец строки".
Его надо пропустить. Используем для этого метод get().
Проблема не решилась
zss
Модератор
Эксперт С++
 Аватар для zss
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,215
Завершенные тесты: 1
07.09.2014, 11:54     Найти ошибку в цикле #5
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
#include <iostream>
using namespace std;
 bool IsSimple(long long k)
 {
     if(k<=1)return true;
     for(long long i=2;i*i<=k;i++)
         if(k%i==0)return false;
     return true;
 }
 bool IsPow2Simple(long long  n)
 {
     long long S=1;
     for(long long i=1;i<=n;i++)
         S*=2;
     return IsSimple(S-1);
 }
int main()
{
    setlocale (LC_ALL,"Russian");
    for (long long i=2;i<=31;++i)
    {
           if( IsSimple(i) && IsPow2Simple(i) ) 
               cout << "   Число Мерсена(2^"<<i<<"-1) при значении "<< i;
           else 
               cout << "   Число Мерсена(2^"<<i<<"-1) при значении "<< i <<" НЕ";
           cout<<" является простым числом.  "<<endl;
    }
    system("pause");
}
long long понадобилось потому, что 2^31 не влезает в разрядную сетку.
Tulosba
07.09.2014, 12:04
  #6

Не по теме:

Цитата Сообщение от zss Посмотреть сообщение
long long понадобилось потому, что 2^31 не влезает в разрядную сетку.
В 32битный unsigned int ещё как влезает.

zss
Модератор
Эксперт С++
 Аватар для zss
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,215
Завершенные тесты: 1
07.09.2014, 12:56     Найти ошибку в цикле #7
Цитата Сообщение от Tulosba Посмотреть сообщение
ещё как влезает.
unsigned влезает, а знаковый нет, и программа на последнем значении циклится.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.09.2014, 14:23     Найти ошибку в цикле #8
zss, где циклится?
zss
Модератор
Эксперт С++
 Аватар для zss
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,215
Завершенные тесты: 1
07.09.2014, 15:16     Найти ошибку в цикле #9
Цитата Сообщение от Tulosba Посмотреть сообщение
где циклится?
Доходит до i=31 и в функции IsSimple() не выходит из цикла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2014, 23:44     Найти ошибку в цикле
Еще ссылки по теме:

C++ Найти смещение точки координаты которой находятся в цикле
C++ Найти сумму первых n-четных натуральных чисел (найти ошибку)
String::insert() в цикле выдает ошибку сегментации C++

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

Или воспользуйтесь поиском по форуму:
Georgg
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 37
07.09.2014, 23:44  [ТС]     Найти ошибку в цикле #10
Сложность данной задачи в том что она должна решаться только с помощью циклов.В той программе что я написал проходит только первая итерация

Добавлено через 3 часа 33 минуты
Сделал вот такой вариант с ручным вводом,почему то на степени 29 виснет..Подскажите почему?
Кликните здесь для просмотра всего текста
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL,"Russian");
    cout << "\t\t\t *** Задача 5.58 ***\n";
    cout <<"===================================================================\n";
    cout << " Проверить числа М.Мерсенна.\n";
    cout <<"===================================================================\n";
 
char quit;
do{    
      
       unsigned long int M(1),m(0);
 
       int p;
           cout << "Введите значение p = "; cin >>p;
       
           for (int i=1;i<=p;i++)
            {
              M*=2;
              if (i==p)
               {
                   M-=1;
                   for (int j=2;j<=M;j++)
                    {
                       M%j==0?m++:m==m;
                    }
                        if (m==1)
                            {
                                 cout << "  Число Мерсена(2^"<<p<<"-1) при значении "<< M <<" НЕ является простым числом.   "<<endl;
                            }
                        else
                            {
                                cout << "   Число Мерсена(2^"<<p<<"-1) при значении "<< M <<" является простым числом.  "<<endl;
                            }
               }
              else continue;
            }
    cout << "Продолжить (y/n)?"<<endl;
    }while((cin>>quit).get() && quit=='y');
}
Yandex
Объявления
07.09.2014, 23:44     Найти ошибку в цикле
Ответ Создать тему
Опции темы

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