Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Metro
1 / 1 / 2
Регистрация: 15.09.2014
Сообщений: 33
#1

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

15.09.2014, 20:16. Просмотров 697. Ответов 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;
}

http://www.cyberforum.ru/cpp-beginners/thread588806.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2014, 20:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Последовательность натуральных чисел, вычисление их НОД методом Евклида (C++):

Вычисление НОД ряда натуральных чисел
Даны натуральные числа m, n1,...,nm (m&gt;=2). Вычислить НОД (n1,...,nm),...

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

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

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

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

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
Лучший ответ Сообщение было отмечено Metro как решение

Решение

А если серьезно.
Введите в функцию пользователя дополнительную переменную, после чего используйте лишь одно условие:
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
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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