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

Найти наибольший общий делитель для 10 заданных натуральных чисел

04.12.2017, 06:30. Показов 5560. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Найти наибольший общий делитель для 10 заданных натуральных чисел.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2017, 06:30
Ответы с готовыми решениями:

Задано n натуральных чисел (n >10) найти наибольший общий делитель
Помогите написать программу, используя подпрограммы: задано n натуральных чисел (n >10) ,найти...

Найти наибольший общий делитель двух натуральных чисел, алгоритм Евклида
Ребята, не могу понять, как сформулировать функцию мейн. Нужно найти наибольший общий делитель двух...

Рекурсия. Вычислить наибольший общий делитель двух натуральных чисел
1) S=a!-cos(a) 2) Вычислить наибольший общий делитель двух натуральных чисел

Найти наибольший общий делитель для заданной последовательности чисел
Дано натуральное число n и натуральные числа a1, a2, ..., an. Найти наиболее больший общий делитель...

4
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
04.12.2017, 08:40 2
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
#include <stdio.h>
int gcd (int, int);
 
int main (void)
{
    int a, b, r;
    printf("a = "); scanf("%d", &a);
    printf("b = "); scanf("%d", &b);
    if (!a || !b) return -1;
 
    r = gcd(a, b);
 
    printf("gcd is: %d\n", r);
    return 0;
}
// -------------- рекурсивное деление с остатком --------------
int gcd (int a, int b)
{
    a = (a<0) ? -a : a;
    b = (b<0) ? -b : b;
    return (!b) ? a : gcd(b, a%b);
}
// -------------- циклическое деление с остатком --------------
/*int gcd (int a, int b)
{
    a = (a<0) ? -a : a;
    b = (b<0) ? -b : b;
    while (a && b)
        if (a > b) a = a%b;
        else b = b%a;
    return a+b;
}*/
// ------------------ циклическое вычитание -------------------
/*int gcd (int a, int b)
{
    a = (a<0) ? -a : a;
    b = (b<0) ? -b : b;
    while (a != b)
    {
        if (a > b) a -= b;
        else b -= a;
    }
    return a;
}*/
// ------------------ рекурсивное вычитание -------------------
/*int gcd (int a, int b)
{
    a = (a<0) ? -a : a;
    b = (b<0) ? -b : b;
    if (a == b) return a;
    else
    {
        if (a > b) a -= b;
        else b -= a;
    }
    return a = gcd (a, b);
}*/
Берите любой понравившийся алгоритм и вперед, до победного.

Добавлено через 51 минуту
Или как вариант можно пойти другим путем:

Получить 10 чисел. Для каждого числа найти все делители от 1 до самого числа и записать их в массив... Т.е. сколько чисел, столько и массивов. После чего заглянуть в каждый из массивов и найти там максимальное число, общее для всех 10 массивов.

Довольно трудоемкая задачка, на первый взгляд. Но только на первый. Вот вам базовый алгоритм для нахождения всех делителей любого числа в любом диапазоне положительных целых чисел. Вам остается только немного модифицировать код для поиска максимального делителя, общего для всех чисел.

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
#include <stdio.h>
#include <stdlib.h>
int * creater (int *, unsigned);                        // создаем массив
int * resize (int *, unsigned, unsigned);           // realloc с перезаписью
int * del (int, int *);                                 // делители числа
void print_ar (int *, int);                         // массив на экран
 
int main (void)
{
    int i;
    int *p;
    int max;
 
    // перебираем все числа от 5 до 12 и для каждого находим делители
    for (i=5; i<12; i++)
    {
        max = 0;                        // размер массива
        p = del(i, &max);           // новый массив с делителями
        if (!p) return -1;
        // число и массив на экран:
        printf("n = %d\n", i);
        print_ar(p, max);
        printf("\n");
 
        // удаляем текущий массив и готовимся к созданию нового
        free(p);
        p = NULL;
    }
 
    return 0;
}
// ------------------------ создаем массив ------------------------
int * creater (int *a, unsigned new_size)
{
    int * new_a = (int *)malloc(new_size * sizeof(int));
    if (!new_a) return NULL;
    a = new_a;
    return a;
}
// --------------------- меняем размер массива --------------------
int * resize (int *a, unsigned size, unsigned new_size)
{
    unsigned i;
    int * new_a = creater(new_a, new_size);
    if (!new_a) return NULL;
    for (i=0; i<size && i<new_size; i++) new_a[i] = a[i];
    if (new_size > size) while (i<new_size) new_a[i++] = 0;
    free(a); a = 0;
    return new_a;
}
// - находим все делители заданного числа и записываем их в массив:
int * del (int n, int * m)
{
    const int MAX_LEN = 512;    // максимум массива 1024 чисел
    int * buffer = NULL;            // массив
    int d = 0;                      // сколько делителей найдено
    int max = 0;                    // размер буфера
    int i;
    for (i=1; i<=n; i++)
    {
        if (n%i == 0)
        {
            if (d + 1 > max)
            {
                if (!max) max = 8;
                else if (max <= MAX_LEN) max *= 2;
                else
                {
                    *m = 0; // переписываем размер массива
                    free(buffer);
                    return NULL;
                }
                // меняем реальный размер буфера в памяти:
                int * temp = resize(buffer, d, max);
                if (!temp)
                {
                    *m = 0;
                    free(temp);
                    return NULL;
                }
                buffer = temp;
            }
            buffer[d++] = i;
        }
    }
    if (!d) { *m = 0; free(buffer); return NULL; }
    // минимизируем размер буфера
    int * minimal = resize(buffer, d, d);
    *m = d; // переписываем размер массива для main
    return minimal;
}
// ----------------------- массив на экран ------------------------
void print_ar (int *a, int max)
{
    int i;
    for (i=0; i<max; i++)
    {
        if (i>0 && i%13 == 0) printf("\n");
        printf("%5d", a[i]);
    }
    printf("\n");
}
1
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 16
04.12.2017, 09:01  [ТС] 3
Нельзя через массив)) так бы сделал
0
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
04.12.2017, 09:43 4
Лучший ответ Сообщение было отмечено aliaksandrpro как решение

Решение

Цитата Сообщение от aliaksandrpro Посмотреть сообщение
Нельзя через массив
Что за бред? Ну тогда вдумчиво вглядывайтесь в алгоритм и думайте как его привести к безмассивному виду:
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
#include <stdio.h>
#include <stdlib.h>
int nod (int, int);
 
int main (void)
{
    const int n = 10;       // количество чисел
    int a[n];               // будущий массив
    int gcd;                    // ноды
 
    int i;
 
    // получаем 10 чисел от пользователя
    for (i=0; i<n; i++)
    {
        printf("input a[%i] = ", i);
        scanf("%d", &a[i]);
    }
 
    gcd = nod(a[0], a[1]);
    for (i=2; i<n; i++)
        gcd = nod(gcd, a[i]);
    printf("GCD = %d\n", gcd);
 
    return 0;
}
// ----------- еще один рекурсивный вычитанием ----------------
int nod (int n, int m)
{
    if(!m || !n) return n+m;
    if(n>m) return nod(m,n-m);
    else return nod(n,m-n);
}
Добавлено через 8 минут
А хотя, тогда все еще проще:
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>
int nod (int, int);
 
int main (void)
{
    const int n = 10;       // количество чисел
    int a;                  // число с клавиатуры
    int gcd;                    // ноды
    int i;
 
    // получаем 10 чисел от пользователя
    for (i=0; i<n; i++)
    {
        printf("input a[%i] = ", i);
        scanf("%d", &a);
        // и сразу же находим ноды
        if (!i) gcd = a;
        else gcd = nod(gcd, a);
    }
 
    // результат на экран
    printf("GCD = %d\n", gcd);
 
    return 0;
}
// ----------- еще один рекурсивный вычитанием ----------------
int nod (int n, int m)
{
    if(!m || !n) return n+m;
    if(n>m) return nod(m,n-m);
    else return nod(n,m-n);
}
Добавлено через 53 секунды
при желании добавьте проверку на преобразование при отрицательных 'a'

Добавлено через 10 минут
Например, вот так:
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>
int gcd (int, int);     // вычисляем нод двух чисел
 
int main (void)
{
    int n = 10;     // количество чисел
    int a;          // число с клавиатуры
    int nod;        // ноды
    int i;
 
    // получаем 10 чисел от пользователя:
    for (i=0; i<n; i++)
    {
        printf("input a[%i] = ", i);
        scanf("%d", &a);
        // и сразу же находим ноды
        if (!i) nod = a;
        else nod = gcd(nod, a);
    }
 
    // результат на экран:
    printf("GCD = %d\n", nod);
 
    return 0;
}
// -------------- рекурсивное деление с остатком --------------
int gcd (int a, int b)
{
    a = (a<0) ? -a : a;
    b = (b<0) ? -b : b;
    return (!b) ? a : gcd(b, a%b);
}
Т.е. это тот же самый код только с самой короткой рекурсией деления с остатком с учетом отрицательных.
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 16
04.12.2017, 13:06  [ТС] 5
Спасибо
0
04.12.2017, 13:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2017, 13:06
Помогаю со студенческими работами здесь

Составить алгоритм и написать функцию, которая находит наибольший общий делитель натуральных чисел а и б
Составить алгоритм и написать функцию, которая находит наибольший общий делитель натуральных чисел...

Найти наибольший общий делитель 8 чисел
Добрый вечер. Господа! Я не в состоянии написать программу сам, так как не понимаю как записать это...

Найти наибольший общий делитель трех чисел
Даны два натуральных числа A и B. Требуется найти их наибольший общий делитель (НОД). Входные...

Нужно найти наибольший общий делитель двух чисел использованием алгоритма Евклида
Дано натуральние числа a, b, c. Получить наибольший общий делитель этих чисел. Для определения НОД...


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

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