IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Найти наибольший общий делитель всех элементов массива, Помогите найти ошибку
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Помогите найти ошибку в коде.


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
int main()
{ /* int mass[N]; */
int mass[N]={2, 4, 8, 16, 32}; // Объявляем массив.
int i, g, h, x, temp, NOD;
/* srand(unsigned(time(NULL))); // Запуск генератора случайных чисел. */
printf("\n Massiv iz 5 elementov: \n");
for(i=0; i<N; i++)
{
/* mass[i]=rand()%10+1; */
printf("\n Mass[%d] = %d. ", i, mass[i]);
}

if(mass[0]<mass[i]) // Если первый элемент массива меньше второго, тогда...
{ g=mass[i]; h=mass[0]; } // запомининаем след. элемент в перем-ой g, а первый в перем-ой h.
if(mass[0]>mass[i]) // Если первый элемент массива больше второго, тогда...
{ g=mass[0]; h=mass[i]; } // запомининаем первый элемент в перем-ой g, а след. в перем-ой h.

do // выполнять до тех пор...
{
if(g%h == 0) // если большее число делится на меньшее без остатка, тогда...
{ NOD=h; } // меньшее число и есть НОД.
else // Иначе.
{ temp=h;
h=g%h; // Второе станет остатком от деления.
g=temp; // А первое число вторым, значения которого записываем во временную переменную.
NOD=h; } // Пока НОДом будет второе число.
}
while(g%h!=0); // ...пока остаток от деления g и h элементов не перестанет быть равным 0.

if (NOD != 1) // Если НОД не равен 1...
{ printf("\n \n NOD = %d. \n", NOD); } // Выводим результат на экран.
else
{ printf("\n \n Chisla ne imeut obschih deliteley \n"); } // Числа не имеют общих делителей.

getch();
return 0;
}




Программа выдает, что общих делителей не найдено, хотя здесь НОД = 2.
Генератор случайных чисел временно отключил, чтобы проверить программу на конкретных числах.

Интересно, что когда я уменьшаю массив до 3 элементов и ввожу 2, 4, 8, то НОД находится верно (НОД=2).

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


У кого-неибудь есть какие-нибудь мысли?

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Debugger + пошаговый проход по программе тебе помогут найти ошибку. Второй раз помогать чтоб ты потом опять начал "править" чужое решение, причем не разобравшись в нем - желающих нет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 30.05.2012 23:59) *

Debugger + пошаговый проход по программе тебе помогут найти ошибку. Второй раз помогать чтоб ты потом опять начал "править" чужое решение, причем не разобравшись в нем - желающих нет.


Твой код не содержал одну проверку, я пытался ее добавить. Твой код целиком и полностью я менять не собирался, но затем мне предложили другой вариант решения, который мне показался интереснее. Признайся просто что не знаешь где ошибка в коде и все, зачем обязательно хохлиться?

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
Признайся просто что не знаешь где ошибка в коде и все, зачем обязательно хохлиться?

Прикольно!
Ты пытаешься взять "на слабо" вместо того, чтобы научиться пользоваться инструментом - пошаговым выполнением с наблюдением за состоянием переменных.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Поверь,человек, которого ты пытаешся взять "на слабо" уже не первый год программирует и не на одном языке.
Твоя задача не является чем то сверх трудным,более того я бы сказал она банальна.
Здесь никто не обязан помогать вам, а вы еще и что то требуете.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Цитата(Krjuger @ 31.05.2012 16:52) *

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


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

Зачем вообще создан этот раздел форума, если не решать поставленые задачи? Чтобы супер-пупер-гуру в С++ в очередной раз показывали, что они на столько круты, что им лень лень написать две, три строки кода? Тем более когда задача такая банальная.

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской

Репутация: -  2  +


Кстати, программа твоя работает, вроде бы, правильно (правда не могу понять как именно). Код я немножко поправлял, но ничего серьёзного, так что перепроверь ещё раз.


#include <stdio.h>

#define N 5

int main() {

int mass[N] = {2, 4, 8, 16, 32};
int i, g, h, x, temp, NOD;


if(mass[0] < mass[N-1]) {
g = mass[N-1];
h = mass[0];
}

if(mass[0] > mass[N-1]) {
g = mass[0];
h = mass[N-1];
}

do {
if(g%h == 0)
NOD=h;
else {
temp = h;
h = g % h;
g = temp;
NOD = h;
}
}
while(g%h != 0);

printf("NOD: %d\n", NOD);

return 0;

}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Игорь, твой код тоже не работает, ошибка в цикле do while! sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Форум создан,чтобы помогать учиться, а не делать все за других.Хотите, чтобы вам сделали, все что захотите и при этом не прилагая никаких усилий, идите к фрилансерам, они вам за денежку все что угодно сделают.
Тебя уже несколько раз "мордой тыкали" в других темах, но результатов это не приносило. Со временем о любом человеке складывается определенное мнение. О вас складывается мнение, что вы считаете здесь всех обязанными вам помогать.Я вам давал наводки,как можно исправить вашу задачу, вы оставались глухи.

Вам четко сказали, как можно выяснить и исправить ошибку,вы взбрыкнули,ваше право.
Щас вам остается либо руками долго и муторно проверять,либо сидеть и ждать в надежде,что кто нибудь поможет.

И чтобы внести ясность,программа, по хорошему, должна считать для любых наборов элементов,а не в строго упорядоченном виде,поэтому

if(mass[0] < mass[N-1]) {
g = mass[N-1];
h = mass[0];
}

if(mass[0] > mass[N-1]) {
g = mass[0];
h = mass[N-1];
}


Просто ужас какой то.А что произойдет, если mass[0] = mass[N-1] ???????
А ничего, что НОД ищется только для двух элементов????? для первого и последнего, а никак не для всех элементов массива.Вы взяли откуда то код, прикрутили массив и теперь кричите,что у вас не работает.То что вы скинули воообще не решает вашу задачу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской

Репутация: -  2  +


Цитата
Игорь, твой код тоже не работает, ошибка в цикле do while!

Ты уж извини, но это твой код (цикл по крайней мере).
А вот код, который прокомментировал Krjuger, мой.

Вообще могу предложить найти минимальный эллемент массива и с ним работать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Krjuger, учится говоришь? Так для этого существуют учебники и задачники по С++. Зачем тогда этот форум?
Если я молчу на ваши наводки, это не значит что я не думаю и не ищу нужное решение. Пока вы тут пальцы от клаву терли, чтобы продемонстрировать, какой вы тут сУрьезный дядечка я сообразил одно такое. cool.gif Может криво, но зато работает.

const int N = 5; // Размер массива.
int main()
{
int mass[N]={8, 16, 64, 32, 7};
int NOD, i, flag;
printf("\n Massiv iz 5 elementov \n");
for(i=0; i<N; i++)
{
printf("\n Mass[%d] = %d ", i, mass[i]);
}
NOD = mass[0]; // Предпологаем, что первый элемент массива - это НОД.
for(i=1; i<N; i++)
if(NOD > mass[i]) // Если предполгаемый НОД больше след. элемент массива,
{ NOD = mass[i]; } // тогда след.элемент - НОД.
flag=1; // Флаг на true
while(flag==1) // Пока флаг = true делаем.
{
flag=0; // Флаг = false.
for(i=0; i<N; i++)
if(mass[i]%NOD!=0) // Если след. элемент массива делится на предпологаемый НОД без остатка,
{ flag=1; } // тогда ставим флаг на true.
NOD--; // Здесь уменьшаем значение НОД.
}
NOD++; // Здесь увеличиваем значение НОД.
printf("\n \n NOD = %d. \n", NOD);

getch();
return 0;
}



Думаю, как прикрутить генератор случайных чисел догадаетесь сами, раз такие умные. dry.gif

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Ну чтож, это уже похоже на правду, но есть один маленький недочет.
Сделайте,чтобы работало с отрицательными числами)А то как то непорядочно получается
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Цитата(Krjuger @ 31.05.2012 22:23) *

Ну чтож, это уже похоже на правду, но есть один маленький недочет.
Сделайте,чтобы работало с отрицательными числами)А то как то непорядочно получается


Пока что не нашел как это можно сделать, но добавил проверку.

for(i=0; i<N; i++)
{
if ((mass[i]<0) || (mass[i]==0)) // Если в массиве найден элемент <=0...
{ printf("\n \n Oshibka! V massive nayden element <= 0."); // Вывести сообщение об ошибке.
break; } // Остановить цикл.
else
if (mass[i]%NOD!=0) // Если след. элемент массива делится на предпологаемый НОД без остатка,
{ flag=1; } // тогда ставим флаг на true.
NOD--; // Здесь уменьшаем значение НОД.
}

...

if ((NOD<0) || (NOD==0)) // Если НОД <=0...
{ printf("\n \n Chisla ne imeut obshih deliteley.\n"); } // числа не имеют общих делителей.
else // Иначе
{ printf("\n \n NOD = %d. \n", NOD); } // Выводим знначние НОД.



Однако, проверка не работает, если 0 выпадат дальше 1-ой позиции в массиве sad.gif. Почему? Думаю!

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Что за такое страшное условие.Прям в дрож бросает.
if ((mass[i]<0) || (mass[i]==0))

Можно записать,как
if (mass[i]<=0) 

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

NOD = mass[0]; // Предпологаем, что первый элемент массива - это НОД.
for(i=1; i<N; i++)
if (mass[i]<=0)
{ printf("\n \n Oshibka! V massive nayden element <= 0."); // Вывести сообщение об ошибке.
break; } // Остановить цикл.
else
{
if(NOD > mass[i]) // Если предполгаемый НОД больше след. элемент массива,
{ NOD = mass[i]; } // тогда след.элемент - НОД.
flag=1; // Флаг на true
while(flag==1) // Пока флаг = true делаем.
{
flag=0; // Флаг = false.
for(i=0; i<N; i++)
if(mass[i]%NOD!=0) // Если след. элемент массива делится на предпологаемый НОД без остатка,
{ flag=1; } // тогда ставим флаг на true.
NOD--; // Здесь уменьшаем значение НОД.
}
NOD++; // Здесь увеличиваем значение НОД.
printf("\n \n NOD = %d. \n", NOD);
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Я бы реализовал всю программу следующим образом:
а) вынес расчёт НОД (GCD) в функцию
б) последовательно обращался к этой функции
int GCD(int a, int b) - не я придумал - честно "тиснул" из "http://e-maxx.ru/algo/euclid_algorithm"
{
int tmp;

while(b)
{
a%=b;
tmp=a; a=b; b=tmp; /*swap(a, b);*/
}
return a;
}

int main()
{
...................................................
NOD=mass[0];
for(i=1; i<N; i++)
{
NOD=GCD(NOD, mass[i]);
}
...............................................
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Krjuger, твоя проверка на фурычит. А вот решение Павла довольно интересна smile.gif, спасибо.

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Да,я закрывающую скобку не туда поставил.Да и вообще с еще 1 флагом проще.

minus=false;
NOD = mass[0]; // Предпологаем, что первый элемент массива - это НОД.
for(i=1; i<N; i++)
if (mass[i]<=0)
{ minus=true;
break; } // Остановить цикл.
else
{
if(NOD > mass[i]) // Если предполгаемый НОД больше след. элемент массива,
{ NOD = mass[i]; } // тогда след.элемент - НОД.
}
if (!minus)
{
flag=1; // Флаг на true
while(flag==1) // Пока флаг = true делаем.
{
flag=0; // Флаг = false.
for(i=0; i<N; i++)
if(mass[i]%NOD!=0) // Если след. элемент массива делится на предпологаемый НОД без остатка,
{ flag=1; } // тогда ставим флаг на true.
NOD--; // Здесь уменьшаем значение НОД.
}
NOD++; // Здесь увеличиваем значение НОД.
printf("\n \n NOD = %d. \n", NOD);
}
else
{ printf("\n \n Oshibka! V massive nayden element <= 0."); // Вывести сообщение об ошибке.
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Есть вариант проще:

int NOD_Function(int a, int b); // Объявляем функцию вычисления НОД.

int NOD_Function(int a, int b)
{ if (b==0) // Если второе число равно 0.
{return a; } // Вернуть значение первого.
else // Иначе
{ return NOD_Function(b, a%b); } // Вернуть значение функции НОД, используя рекурретность.
}




Думаю как применять эту функцию и как обойти случай, когда все элементы массива равны нулю - догадаетесь сами. smile.gif

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Цитата
Думаю как применять эту функцию и как обойти случай, когда все элементы массива равны нулю - догадаетесь сами.

Ты в загадки с нами играешь что ли?Нам все равно и гадать нет нужны.
То что ты сделал не сработает на тесте а=10 б=0,оно выдаст 10.Так что думай дальше.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 16:27
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name