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

Числа-близнецы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.92
Arshavin
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 26
01.07.2010, 17:09     Числа-близнецы #1
1)Дано натуральное число n. Выяснить, имеются ли среди чисел n, n+1, ..., 2n близнецы, т.е. простые числа , разность между которыми равна двум. (Определить процедуру, позволяющую распознавать простые числа).
2)Дана действительная квадратная матрица порядка n. Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы (рис Е)

Числа-близнецы





Помогиет бедному студенту !Только начал Си изучать а задачи уже сдавать надо)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,688
02.07.2010, 17:11     Числа-близнецы #2
Задача 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
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
////////////////////////////////////////////////////////////////////////////////
//Дано натуральное число n. Выяснить, имеются ли среди чисел n, n+1, ..., 2n 
//близнецы, т.е. простые числа , разность между которыми равна двум. 
//(Определить процедуру, позволяющую распознавать простые числа).
////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <cmath>
 
typedef std::vector<long>  T_nums;
 
const long MIN_PROSTOE          = 2;
const long RAZNOST_MEJDU_BLIZN  = MIN_PROSTOE;
////////////////////////////////////////////////////////////////////////////////
long  get_first_bliznec
    (
        long  left,
        long  right
    )
{
    struct T_generate_s_pereryvom
    {
        long  cur_num_;
        long  baza_right_;
        long  blizn_left_;
        T_generate_s_pereryvom
            (
                long  start_num,
                long  baza_right,
                long  blizn_left
            ) : cur_num_    (start_num), 
                baza_right_ (baza_right), 
                blizn_left_ (blizn_left)
        {}
        long operator()()
        {
            if(cur_num_ == baza_right_ + 1)
            {
                cur_num_ = blizn_left_;
            }
            return  cur_num_++;
        }
    };
 
    const long RIGHT_BAZA_ROUND = static_cast<long>(sqrt(static_cast<double>(right)));
 
    T_nums  nums(right - left + 1 + RIGHT_BAZA_ROUND - MIN_PROSTOE + 1);
    std::generate(nums.begin(), nums.end(), 
                  T_generate_s_pereryvom(MIN_PROSTOE, RIGHT_BAZA_ROUND, left));    
 
    class T_bliznec_exception : public std::exception
    {
        long  bliznec_;
    public:
        T_bliznec_exception(long  bliznec) : bliznec_(bliznec)
        {}
 
        long get_bliznec() const
        {
            return  bliznec_;
        }
    };
 
    struct T_get_bliznec_from
    {
        T_nums  prostye_;
        long    left_bound_;
        T_get_bliznec_from(long  left_bound) : left_bound_(left_bound)
        {}
        void operator() (long  cur_num)
        {
            struct T_delitsya
            {
                long  delimoe_;
                T_delitsya(long  delimoe) : delimoe_(delimoe)
                {}
                bool operator() (long delitel)
                {
                    return delimoe_ % delitel == 0;
                }
            };
            if(prostye_.empty())
            {
                prostye_.push_back(cur_num);
            }
            else
            {
                if(std::find_if(prostye_.begin(), prostye_.end(), T_delitsya(cur_num)) 
                   == prostye_.end())
                {
                    if(cur_num - prostye_.back() == RAZNOST_MEJDU_BLIZN
                       && left_bound_ <= prostye_.back())
                    {
                        throw T_bliznec_exception(prostye_.back());
                    }
                    prostye_.push_back(cur_num);
                }
            }
        }
    };
    long  bliznec = 0;
    try
    {
        std::for_each(nums.begin(), nums.end(), T_get_bliznec_from(left));        
    }
    catch(const T_bliznec_exception& e)
    {
        bliznec = e.get_bliznec();
    }   
    return bliznec;
}
////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    long n;
    do
    {
        std::cout << "n = ";
        std::cin >> n;    
    }while(n < 1);
    long m = 2 * n;
    long bliznec = get_first_bliznec(n, m);
    std::cout << "На отрезке ["
              << n
              << ", "
              << m
              << "] ";
    if(bliznec)
    {
        std::cout << "имеются простые числа-близнецы. "
                  << std::endl
                  << "Первые из них: "
                  << bliznec
                  << ", "
                  << bliznec + RAZNOST_MEJDU_BLIZN
                  << "."
                  << std::endl;
    }
    else
    {
        std::cout << "нет простых чисел-близнецов."
                  << std::endl;
    }
    return 0;
}
Arshavin
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 26
03.07.2010, 04:24  [ТС]     Числа-близнецы #3
Mr.X, Можеш на СИ сделать а то СИ++ ёще не изучал даж
pannaruto
 Аватар для pannaruto
11 / 11 / 2
Регистрация: 12.05.2010
Сообщений: 29
03.07.2010, 23:00     Числа-близнецы #4
1)Дано натуральное число n. Выяснить, имеются ли среди чисел n, n+1, ..., 2n близнецы, т.е. простые числа , разность между которыми равна двум. (Определить процедуру, позволяющую распознавать простые числа).
Попробуй этот простой вариант. Ну думаю у Mr.X лучше.
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
char isPrime( int n )
{
    int squareRoot;
    int i;
 
    if( n < 2 ) return 0;
 
    squareRoot = (int)(sqrt((float)n));
    for( i = 2; i <= squareRoot; i++ )
        if( n % i == 0 )
            return 0;
    return 1;
}
 
int main()
{
    int n, i;
 
    printf("Enter natural number : ");
    scanf("%d", &n );
 
    for( i = n; i <= 2 * n; i++ )
        if( isPrime(i) && isPrime( i + 2 ) )
            printf("%-4d and %4d\n", i, i + 2 );
 
    getch();
    return 0;
}
Arshavin
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 26
04.07.2010, 06:03  [ТС]     Числа-близнецы #5
pannaruto, Забыл добавить должны быть функции отдельно реализующие ввод(если есть ),расчёт и вывод либо специальные функции описанные в условии задачи !НЕдолжны использоваться глобальные параметры!
pannaruto
 Аватар для pannaruto
11 / 11 / 2
Регистрация: 12.05.2010
Сообщений: 29
04.07.2010, 09:20     Числа-близнецы #6
Я думаю важен алгоритм, не важен код. Если ты мой алгоритм понимаешь, напишите свою прог.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.07.2010, 10:51     Числа-близнецы #7
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
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
 
int isprime(int p);
 
int main()
{
   int i = 0, num = 0;
 
   setlocale(LC_ALL, "russian");
 
   printf("Введите число: ");
   scanf ("%d", &num);
 
   for (i = 0; i < 2 * num; ++i)
      if (isprime(i) && isprime(i + 2))
         printf("Числа %d и %d являются близнецами\n", i, i + 2);
 
   system("pause");
}
 
int isprime(long p)
{
   int d;
 
   for (d = 2; d < p; ++d)
      if (p % d == 0)
         return 0;
 
   return 1;
}
Добавлено через 27 минут
2A
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
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
 
#define MAX_VAL 99 
 
void randomize_matrix (int ** lpmatrix, int nrow, int ncol);
void print_to_display (int ** lpmatrix, int nrow, int ncol);
 
int main()
{
   int i = 0, j = 0, nsize = 0, **lpmatrix = NULL;
   int max = 0;
 
   setlocale(LC_ALL, "russian");
 
   printf("Введите размер матрицы (Число N): ");
   scanf ("%d", &nsize);
 
   if((lpmatrix = (int **)malloc(nsize * sizeof(int *))) == NULL) {
      perror("Ошибка выделения памяти\n");
      abort();
   }
 
   for (i = 0; i < nsize; ++i)
   {
      if ((lpmatrix[i] = (int *)malloc(nsize * sizeof(int))) == NULL) {
         perror("Ошибка выделения памяти\n");
         abort();
      }
   }
 
   randomize_matrix(lpmatrix, nsize, nsize);
   print_to_display(lpmatrix, nsize, nsize);
 
   /* ПОИСК МАКСИМУМА */
   max = lpmatrix[0][0];
   for (i = 0; i < nsize; ++i)
      for (j = i; j < nsize; ++j)
         if(lpmatrix[i][j] > max)
            max = lpmatrix[i][j];
 
   printf("Максимальное значение в заданной области: %d\n", max);
 
   for (i = 0; i < nsize; ++i)
      free(lpmatrix[i]);
   free(lpmatrix);
 
   system("pause");
   return 0;
}
 
void randomize_matrix(int ** lpmatrix, int nrow, int ncol)
{
   int i = 0, j = 0;
 
   for (i = 0; i < nrow; ++i)
      for (j = 0; j < ncol; ++j)
         lpmatrix[i][j] = rand() % MAX_VAL;
}
 
void print_to_display(int ** lpmatrix, int nrow, int ncol)
{
   int i = 0, j = 0;
 
   for (i = 0; i < nrow; ++i) 
   {
      for (j = 0; j < ncol; ++j)
         printf("%-3d ", lpmatrix[i][j]);
 
      printf("\n");
   }
}
Задачи для других областей будут отличаться только условиями в цикле поиска.
Сейчас ухожу, как вернусь доделаю.

Добавлено через 47 минут
C
1
2
   for (i = 0; i < nsize; ++i)
      for (j = 0; j <= i; ++j)

C
1
2
   for (i = 0; i <= nsize / 2; ++i)
      for (j = i; j < nsize - i; ++j)

C
1
2
   for (i = nsize - 1; i >= nsize / 2; --i)
      for (j = nsize - i - 1; j <= i; ++j)

C
1
2
3
4
5
6
7
8
9
10
   for (i = 0; i <= nsize / 2; ++i)
   {
      for (j = i; j < nsize - i; ++j) 
      {
         if(lpmatrix[i][j] > max)
            max = lpmatrix[i][j];
         if(lpmatrix[nsize-i-1][nsize-j-1] > max)
            max = lpmatrix[nsize-i-1][nsize-j-1];
      }
   }

C
1
2
3
4
5
6
7
8
9
10
   for (i = 0; i <= nsize / 2; ++i)
   {
      for (j = i; j < nsize - i; ++j) 
      {
         if(lpmatrix[j][i] > max)
            max = lpmatrix[j][i];
         if(lpmatrix[nsize-j-1][nsize-i-1] > max)
            max = lpmatrix[nsize-j-1][nsize-i-1];
      }
   }

C
1
2
3
4
   for (i = 0; i <= nsize / 2; ++i)
      for (j = i; j < nsize - i; ++j) 
         if(lpmatrix[j][i] > max)
            max = lpmatrix[j][i];

C
1
2
3
4
   for (i = 0; i <= nsize / 2; ++i)
      for (j = i; j < nsize - i; ++j) 
         if(lpmatrix[nsize-j-1][nsize-i-1] > max)
            max = lpmatrix[nsize-j-1][nsize-i-1];

C
1
2
3
4
   for (i = 0; i < nsize; ++i)
      for (j = 0; j < nsize - i; ++j) 
         if(lpmatrix[i][j] > max)
            max = lpmatrix[i][j];

C
1
2
3
4
   for (i = 0; i < nsize; ++i)
      for (j = nsize - 1; j >= nsize - i - 1; --j) 
         if(lpmatrix[i][j] > max)
            max = lpmatrix[i][j];
pannaruto
 Аватар для pannaruto
11 / 11 / 2
Регистрация: 12.05.2010
Сообщений: 29
04.07.2010, 11:12     Числа-близнецы #8
Задачи для других областей будут отличаться только условиями в цикле поиска.
Ещё отличатся начальными значениями max
А, Б, В, Д, Е, Ж, И : Начальное зна- : lqmatrix[0][0]
Г : lqmatrix[nsize - 1][0]
......
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2010, 14:46     Числа-близнецы
Еще ссылки по теме:

C++ числа-близнецы
C++ Определить, есть ли среди чисел в заданном интервале близнецы (простые числа, разница между которыми = 2)

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.07.2010, 14:46     Числа-близнецы #9
Цитата Сообщение от pannaruto Посмотреть сообщение
Ещё отличатся начальными значениями max
да-да, точно, но я думаю, тут уже сообразить несложно, главное обход выполнить
Yandex
Объявления
04.07.2010, 14:46     Числа-близнецы
Ответ Создать тему
Опции темы

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