Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Помогите решить задачу на фортране (http://forum.oszone.net/showthread.php?t=214130)

3ddeni 27-08-2011 01:59 1740126

Помогите решить задачу на фортране
 
вот условие : Два натуральных числа называются "дружественными", если каждое из них равно сумме всех делителей другого, за исключением его самого (таковы, например, числа 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 1740208

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 1740217

Tonny_Bennet, число жестко заданно, лучше что-то вроде

Код:

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

3ddeni 27-08-2011 11:10 1740219

ооо большое спасибо ) думаю теперь разберусь

3ddeni 27-08-2011 12:07 1740240

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

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

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

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 1740285

задачу решил

Tonny_Bennet 27-08-2011 22:05 1740607

Цитата:

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

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


Время: 23:05.

Время: 23:05.
© OSzone.net 2001-