Войти

Показать полную графическую версию : [решено] Помогите решить задачу на фортране


3ddeni
27-08-2011, 01:59
вот условие : Два натуральных числа называются "дружественными", если каждое из них равно сумме всех делителей другого, за исключением его самого (таковы, например, числа 220 и 284). Напечатать все пары "дружественных" чисел, не превосходящих заданного натурального числа.
(Определить функцию, вычисляющую сумму делителей числа.)

и вот еще мои наброски ...до конца завершить не получилос ...видимо не знаю каких то тонкостей (


program pr4
integer s1
real k,g,s
write(*,*) "vvdedite chislo k"
read(*,*) k
do g=2,k
s=del(g)
s1=del(s-1)
if((s1==g).and.(s/=g).and.(s/=x)) then
write(*,*) "Chisla",a," i",s,"-drugestvenie"
x=s1
endif
end do
contains
integer function del(a)
integer s
integer h,i
h=a
s=0
do i=1,a-1
if(mod(h,i)==0) then
s=s+i
end if
end do
del=s
end function del

end

Tonny_Bennet
27-08-2011, 10:52
3ddeni, извини, компилятора фортрана под рукой не оказалось. Написал на c#. Работает. Код с комментариями и достаточно прозрачен. В диапазоне до 300 выводит такие пары:
6 6
28 28
220 284
284 220



static void Main(string[] args)
{
//верхний предел
int max_value = 500;

//суммы делителей
int sum_1;
int sum_2;

//перебираем в цикле все возможные натуральные числа
//не превосходящие максимального значения
for (int i=1; i <= max_value; i++)
{
//обнуляем суммы
sum_1 = 0;
sum_2 = 0;

//находим все делители числа i
for (int j = 1; j < i; j++)
{
//если числа делятся без остатка
if (Math.IEEERemainder(i,j) == 0)
{
//суммируем делители числа i
sum_1 = sum_1 + j;
}
}

//находим все делители sum -
//суммы числа делителей i
for (int j = 1; j < sum_1; j++)
{
//если числа делятся без остатка
if (Math.IEEERemainder(sum_1, j) == 0)
{
//суммируем делители числа sum_1
sum_2 = sum_2 + j;
}
}

//Если сумма делителей второго числа равна первому
//найдена пара "дружественных чисел"
if (i == sum_2)
{
Console.WriteLine("Pair: " + i.ToString() + " " + sum_1.ToString());
}

}

Console.WriteLine("Press any key for exit...");
Console.ReadKey();
}

ferget
27-08-2011, 11:07
Tonny_Bennet, число жестко заданно, лучше что-то вроде

int max_value = Convert.ToInt32(Console.ReadLine());

3ddeni
27-08-2011, 11:10
ооо большое спасибо ) думаю теперь разберусь

3ddeni
27-08-2011, 12:07
логика решения задачи мне понятна ...реализовал ее с использованием вложенных циклов.

возникают проблемы при использовании функций в фортране

тут немного переделал код

program pr4
integer s1,k,g,s
write(*,*) "vvdedite chislo k"
read(*,*) k

do g=2,k
s=del(g)
s1=del(j)
if((s1==g).and.(s/=g).and.(s/=x)) then
write(*,*) "Chisla",g," i",s,"-drugestvenie"
x=s1
endif

end do
contains
integer function del(a)
integer s,i,a
s=0
do i=1,a-1
if(mod(a,i)==0) then
s=s+i
end if
end do
del=s
end function del

end

3ddeni
27-08-2011, 13:41
задачу решил

Tonny_Bennet
27-08-2011, 22:05
Tonny_Bennet, число жестко заданно, лучше что-то вроде
Код:
int max_value = Convert.ToInt32(Console.ReadLine()); »

Абсолютно согласен, но когда лень и быстро пишешь - по мне уж лучше использовать меньше плавающих параметров




© OSzone.net 2001-2012