Официальный сайт студ.городка НГТУ
Программирование и БД » Насчет лаб по информатике 

#1  31.10.06 21:07

Насчет лаб по информатике

Прива народ! Хелп плиз кто чем может...
Есть задание: найти НОД всех элементов массива. Как сие организовать? Хотя бы идею...
Или может уже есть где выполненные лабы по инфе? 1 курс

Offline

#2  31.10.06 21:49

Re: Насчет лаб по информатике

напиши хоть че за яцык

Offline

#3  31.10.06 21:50

Re: Насчет лаб по информатике

бугогааа.... :)))))

находишь НОД для первых двух элементов, потом для 3-го и НОДа, потом для 4-го и НОДа и т.д.тд.тд.тд.тд.тд.тд.тд...........

Offline

#4  31.10.06 21:57

Re: Насчет лаб по информатике

вот тебе идея

Код: cpp:

int NOD( int x, int y )
{
	int nod = (x < y ? x : y); 
	while( x % nod  ||  y % nod ) --nod;
	return nod;	
}

остальное додумаешь поди :-))

Исправлено Смайлек (31.10.06 22:01)

Offline

#5  31.10.06 22:02

Re: Насчет лаб по информатике

какой адский код
не осилил )

Пока малое больше нуля, повторяй:
НОД ему временно ты приравняй,
И большое на малое ты раздели,
И остаток ты малым теперь назови,
А большим НОД назови ты теперь
И к началу вернись, и в Евклида ты верь!

Исправлено xaver (31.10.06 22:06)

Offline

#6  31.10.06 22:04

Re: Насчет лаб по информатике

Наибольший общий делитель двух целых чисел (алгоритм Евклида)

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

Данный алгоритм вычисления НОД двух целых чисел a и b состоит в следующем: если хотя бы одно из чисел равно нулю, то НОД(a,b)=|a+b|, в других случаях последовательно находятся остатки ri от делений:

a на b-a=bq1+r1,
b на r1-b=r1q2+r2,
r1 на r2-r1=r2q3+r3,
. . . . . .
и т.д., пока rn+1 не станет равно нулю. Тогда НОД(a,b)=НОД(b,r1)=НОД(r1 ,r2)=...=НОД(rn-1 ,rn )=rn.

А вот как этот алгоритм описан в книге Д.Э. Кнута "Искусство программирования".

1) [Проверка] Если a<b, то a<->b.

2) [Нахождение остатка] Разделим a на b, и пусть остаток от деления будет равен r (где 0<=r<b).

3) [Сравнение с нулем] Если r=0, то выполнение алгоритма прекращается; b - искомое значение.

4) [Замещение] Присвоить a<-b, b<-r и вернуться к шагу 1.


реализация данного алгоритма на Паскале:

function nod(a,b: integer):integer;
begin
if a<b then begin
a := a xor b;
b := a xor b;
a := a xor b;
end;
while not ((a=0) or (b=0)) do
if a >= b then a := a mod b else b := b mod a;
if a = 0 then result := b else result := a;
end;

Offline

#7  31.10.06 22:46

Re: Насчет лаб по информатике

xaver написал(а):

function nod(a,b: integer):integer;
begin
if a<b then begin
a := a xor b;
b := a xor b;
a := a xor b;
end;
while not ((a=0) or (b=0)) do
if a >= b then a := a mod b else b := b mod a;
if a = 0 then result := b else result := a;
end;

клёво! ))
только зачем нужно лишнюю перестановку (if a<b then ...XOR....) выполнять, если здесь (if a >= b then a := a mod b else b := b mod a;) уже есть сравнение
?

Offline

#8  31.10.06 23:51

Re: Насчет лаб по информатике

Не Ори На Меня!!!

Offline

#9  01.11.06 13:53

Re: Насчет лаб по информатике

Смайлек, xaver, ацццццкие какие-то алгоритмы :(((

Код::

if(a==0||b==0)
    return a+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;

за ненадобностью можно оставить тока один цикл.


Где нашел не знаю, но почему то его предваряет описание алгоритма Эвклида с делениями.

Offline

Программирование и БД » Насчет лаб по информатике 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.036 сек.
Выполнено 14 запросов.