Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2010, 12:12   #1
Анютик_sexi
 
Регистрация: 16.06.2010
Сообщений: 3
Стрелка Указатели

Даны натуральные числа р и q. Получить все делители числа q, взаимно простые с р.
Я в долгу не остаюсь...
Анютик_sexi вне форума Ответить с цитированием
Старый 16.06.2010, 12:15   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

ммм, напиши мне, помогу
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 16.06.2010, 14:26   #3
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

Здесь считается, что q и р не больше 100, если могут быть больше нужно изменить объявление массивов в var
Код:
var i,j,q,p,n,m,min:integer;
    delit1, delit2:array 1..100 of integer;
    flag:boolean;

begin
//ищем делители q(не тривиальные)
n:=0;
for i:=2 to (q-1) do
if ((q mod i)=0) then
begin
n:=n+1;
delit1[n]:=i;
end;

//для каждого делителя q проверяем, не является ли он взаимнопростым с р
m:=0;
for i:=1 to n do
flag:=false;
begin
if delit1[i]<p then min:=delit1[i] else min:=p;

for j:=2 to min do
if (delit1[i] mod j = 0) and (p mod j = 0) then flag:=true;

if (not flag) then 
begin
m:=m+1;
delit2[m]:=delit1[i];
end;
end;
//выводим результат на экран
for i:=1 to m do writeln(delit2[i]);
end.
Snejnaya вне форума Ответить с цитированием
Старый 16.06.2010, 14:38   #4
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Код:
program Project6;
{$APPTYPE CONSOLE}
var
  p, q, i, d: Integer;
  s: Real;
function gcd(a, b: Integer): Integer;
begin
  while (a > 0) and (b > 0) do
    if a > b then a := a mod b
    else b := b mod a;
  gcd := a + b;
end;
begin
  ReadLn(p, q);
  s := sqrt(q);
  for i := 1 to trunc(s) do if q mod i = 0 then begin
    if gcd(i, p) = 1 then WriteLn(i);
    if i <> s then begin d := q div i; if gcd(d, p) = 1 then WriteLn(d); end;
  end;
  ReadLn;
end.
Правда не по возрастанию, но об этом никто не просил. Зато быстро(правда здесь оно нафиг не нужно, но я уж пишу, как пишу )

Последний раз редактировалось megachuhancer; 16.06.2010 в 14:50.
megachuhancer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели @Manya@ Общие вопросы C/C++ 4 17.05.2010 13:53
Указатели GrihaI Общие вопросы C/C++ 11 06.05.2010 18:53
C++ (указатели). slim>>> Помощь студентам 8 03.03.2010 19:39
Указатели papochka Общие вопросы C/C++ 2 14.11.2009 22:06
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39