Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Metro
1 / 1 / 2
Регистрация: 15.09.2014
Сообщений: 33
#1

Последовательность натуральных чисел, вычисление их НОД методом Евклида - C++

15.09.2014, 20:16. Просмотров 654. Ответов 4
Метки нет (Все метки)

Уважаемые форумчане, прошу помощи в решении задачи:
Составьте программу, которая позволяет организовать ввод последовательности натуральных чисел. Индикатором окончания ввода является число 0. Для элементов данной последовательности вычисляется наибольший общий делитель. Организовать в задаче ввод данных из файла и вывод данных в файл.

Только познакомился с рекурсией поэтому не сильно в ней пока понимаю, NetBeans выдает Segmentation fault ( думаю дело в стэке). Заранее спасибо.
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
#include <cstdlib>
#include "iostream"
#include "fstream"
 
using namespace std;
 
int NOD (int a, int b){
    
    if (a == 0) 
        return b;   
    if (b == 0) 
        return a;
    if (a > b)
        return NOD (a%b,b);
    if (b > a)
        return NOD (a,b%a);
}
 
int main(int argc, char** argv) {
    ifstream in_file("input.txt");
    ofstream out_file ("output.txt");
    int b, result, i=0, j=0;
    char *ch = new char [256];
    in_file.getline(ch,256);
    while ((ch[i]!=48) ||(ch[i]!='\n'))
    {
        if ((ch[i]>=49)||(ch[i]<=57))
                j++;
        i++;
    }
    char *mas = new char [j];
    i = 0;
    j = 0;
    while ((ch[i]!=48) ||(ch[i]!='\n'))
    {
        if ((ch[i]>=49)||(ch[i]<=57)){
                mas[j] = ch[i];
                j++;
        }
        i++;
    }
    delete []ch;
    i = 1;
    result = static_cast<int>(mas[0]) - 48;
    while (i < (sizeof mas / sizeof mas[0]))
    {
        b = static_cast<int>(mas[i]) - 48;
        result = NOD (result,b);
        i++;
    }
    out_file << result;
    delete []mas;
    in_file.close();
    out_file.close();
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2014, 20:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Последовательность натуральных чисел, вычисление их НОД методом Евклида (C++):

Найти наибольший общий делитель (НОД) двух введенных натуральных чисел, используя алгоритм Евклида - C++
Найти наибольший общий делитель (НОД) двух введенных натуральных чисел, используя алгоритм Евклида. Алгоритм Евклида: вычитаем числа...

Вычисление НОД ряда натуральных чисел - C++
Даны натуральные числа m, n1,...,nm (m&gt;=2). Вычислить НОД (n1,...,nm), воспользовавшись для этого соотношением...

Написать функции рекурсивной и не рекурсивной реализации алгоритма Евклида нахождения наибольшего общего делителя (НОД) двух натуральных чисел - C++
Написать функции рекурсивной и не рекурсивной реализации алгоритма Евклида нахождения наибольшего общего делителя (НОД) двух натуральных...

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

Вычисление нок и нод переменных натуральных чисел - C++
Здравствуйте. Искал подобную тему по форуму, но там все либо на 2 числа либо на несколько, но с фиксированным числом после компиляции....

Вычисление НОД по алгоритму Евклида (как организовать код?) - C++
Всем доброго время суток, помогите составить код задачи, я знаю как ее решить, но не знаю как правильно организовать. Вот условие...

4
DJest
0 / 0 / 1
Регистрация: 15.09.2014
Сообщений: 8
15.09.2014, 21:25 #2
К чему столько лишних действий?
4 return'a - это, конечно, знатное извращение, но все же..
0
Metro
1 / 1 / 2
Регистрация: 15.09.2014
Сообщений: 33
15.09.2014, 21:29  [ТС] #3
DJest, Сложно объяснить, первоочередной задачей стояло - "лишь бы работало", о граммотности собирался думать потом, но вот не заводится и думать по сути не над чем..
0
DJest
0 / 0 / 1
Регистрация: 15.09.2014
Сообщений: 8
15.09.2014, 21:33 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
А если серьезно.
Введите в функцию пользователя дополнительную переменную, после чего используйте лишь одно условие:
C
1
2
3
4
5
if (b==0)
p=a;
else
p=NOD(b, a%b);
return p;
К чему столько массивов? Попробуйте действовать следующим образом.
Считайте первую цифру.
Перейдите в цикл.
Первая переменная пусть будет принята за НОД.
Тогда возьмите вторую переменную и найдите НОД от нее и первой.
После этого - возьмите еще одну переменную и найдите НОД от нее и нынешнего значения НОДа.
0
Metro
1 / 1 / 2
Регистрация: 15.09.2014
Сообщений: 33
15.09.2014, 22:00  [ТС] #5
DJest, хах, спасибо. кстати траблы с памятью были не из за рекурсии а массивов =)
0
15.09.2014, 22:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2014, 22:00
Привет! Вот еще темы с ответами:

Даны два натуральных числа. Получить их наибольший общий делитель (НОД), используя алгоритм Евклида - C++
Даны два натуральных числа. Получить их наибольший общий делитель (НОД), используя алгоритм Евклида. С помощью оператора цикла for ...

Разработать рекурсивную функций, возвращающую значение для нахождения НОД методом Евклида - C++
разработать рекурсивную функций,возвращающую значение для нахождения НОД методом Евклида НОД(a,b)=а,если a=b ...

НОД двух чисел алгоритм Евклида - C++
Найти найбольший общий делитель двух чисел по алгоритму Евклида. Использовать рекурсию.

Найти НОД двух целых чисел по алгоритму Евклида. - C++
задание: Найти НОД двух целых чисел по алгоритму Евклида.


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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