Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
0 beğenilme 0 beğenilmeme
577 kez görüntülendi
Merhaba.

Örneğin;

$x,y,z$ birbirinden farklı tam sayılar olmak üzere $\frac{1}{x} + \frac{1}{y} + \frac{1}{z}=1$ denklem sisteminde x,y,z değerlerinine tek tek $1$ ile $10^2$ arasındaki bütün tam sayıları denetecek (toplamda $(10^2)^3$ deneme olacak) ve denklem sistemini sağlayan çözüm veya çözümleri (x,y,z) üçlüleri biçiminde ekrana yansıtacak  programın Java kodu nasıl yazılabilir?

 

 

Not. iç içe 3 for döngüsünü şu şekilde

        for ( x=1; x<=100; x++)
        {
            for (y=1; y<=100; y++)
            {
                for (z=1; z<=100; z++)
                {

kurmaya çalıştım ancak program sonucu 1,4 çıkan değeri de doğru kabul ediyor. Bu hatadan nasıl kurtulabilirim?

 

Teşekkürler.
Veri Bilimi kategorisinde (16 puan) tarafından  | 577 kez görüntülendi
int x = 1;
        int y = 1;
        int z = 1;
        int count = 0;
        double formula = ((1/x)+(1/y)+(1/z));
        for ( x=1; x<=100; x++)
        {
            for (y=1; y<=100; y++)
            {
                for (z=1; z<=100; z++)
                {

                    formula = ((1/x)+(1/y)+(1/z));

                    if (formula == 1.0)
                    {
                        System.out.println("x="+x+"y="+y+"z="+z);
                        System.out.println(formula);
                        count++;
                    }
                }
            }

        }
        System.out.println(count+" kere var");
Bu kodda birbirinden farklı olması koşulunu henüz sağlatmadım.
$x<y<z$ varsayıp

y=x+1; y=<100;y++...

z=y+1; z=<100 ....

yazsan olmaz mı?

Doğan Hocam sanırım benim yazdığım ile mantık aynı olacak.

 

Şu şekilde sorunu çözebildim. Ancak çok karmaşık gibi geldi bana. Daha sade bir biçimde çözüm önerisi olabilir mi? Double sorununu çözmek için mod kullandım. 

(Not bu koda C# diliyle yazıldı)

 

[Duzenleme notu : Linkin olme ihtimaline karsi kodu buraya tasidim. eloi.]

using System;
using System.Collections.Generic;
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {

            double x = 1;
            double y = 1;
            double z = 1;
            int count = 0;
            List<double> values = new List<double>();
            double formula = ((1 / x) + (1 / y) + (1 / z));
            for (x = 1; x <= 100; x++)
            {
                for (y = 1; y <= 100; y++)
                {
                    for (z = 1; z <= 100; z++)
                    {
                        
                        formula = ((1 / x) + (1 / y) + (1 / z));
                        //var n = Math.Truncate(formula);
                        //Console.WriteLine(formula);
                        if (x != y && x !=z && z != y)
                        {
                            if (formula % 1 == 0)
                            {
                                if (values.Count<1)
                                {
                                    Console.WriteLine("x=" + x + "y=" + y + "z=" + z);
                                    Console.WriteLine(formula);
                                    count++;
                                }
                                
                                values.Add(x);
                                values.Add(y);
                                values.Add(z);

                                foreach (var item in values)
                                {

                                    if (!values.Contains(item))
                                    {
                                        Console.WriteLine("x=" + x + "y=" + y + "z=" + z);
                                        Console.WriteLine(formula);
                                        count++;
                                        //continue;
                                    }
                                }
                                

                                
                            }
                        }
                        
                    }
                }

            }
            Console.WriteLine(count + " kere var");


            Console.ReadKey();
        }
    }
}

 

sitede sıkıntı mı var? Yorum hata verdikten sonra birkaç defa gönderilmiş....
Benim önerimin amacı birbirinden farklı çözümler bulmak (ve daha hızlı olması).

$\frac{1}{x}+\frac{1}{y}+\frac{1}{z} =1$  denlemini soyle yazalim:

$\frac{xz+xy+yz}{xyz}=1$, Ama iki sayiyi birbirine boluyorsam ve cevap $1$ geliyorsa bu o iki sayinin birbirine esit oldugu anlamina gelir, Yani kisacasi virgullu sayilar ile ugrasma (bolme islemi hem yavas hem de icsel olarak hatali) yerine cozum bulma kriterinizi $xz+xy+yz == xyz$ diye degistirebilirsiniz.

 

Duzenleme sonrasi: Bolme islemi icsel olara hatali dan kastim virgullu sayilarin bilgisayardaki gosteriminin yarattigi problemler idi. Su ve su sorulara bir bakin isterseniz.

@DoganDonmez hocanin da yorumu burada onemli yani $(2,4,4)$, $(4,2,4)$,$ (4,4,2)$ gibi permutasyonlari terar tekrar hesaplamak istemiyoruz bilgisayara yazik.

$x \geq y \geq z$ diye dusunursek bu permutasyonlari elimine ederiz. $\geq$ onemli burada eger $>$ kullansaydik $(3,3,3)$ uclusunu kaciracatik. Bu sayede progamimir daha hizli calisacak (Ne kadar daha hizli?).

Hepsini birlestirirsek soyle bir python kodu yazabiliriz, (($xy+xz+yz$) paranteze aldim daha az carpma islemi olsun diye cok da gerekli degil.)

for x in range(1,101):
   for y in range(1,x+1):
      for z in range(1,y+1):
         if x*(y + z) + y*z == x*y*z:
            print((x,y,z))

 

x+1 yerine x-1, y+1 yerine y-1 mi olmalı acaba?

@DoganDonmez hocam range(x,y) python da $[x,\cdots,y-1]$ araligini veriyor. $x=y=z$ durumuna da bakmak istedigim icin $x+1$, $y+1$ yazdim.

asagida iki kodu ve sonuclarini paylastim

>>> for x in range(101):
...     for y in range(1,x):
...             for z in range(1,y):
...                     if x*(y+z) + y*z == x*y*z:
...                             print((x,y,z))
... 
(6, 3, 2)
>>> for x in range(1,101):
...    for y in range(1,x+1):
...       for z in range(1,y+1):
...          if x*(y + z) + y*z == x*y*z:
...             print((x,y,z))
... 
(3, 3, 3)
(4, 4, 2)
(6, 3, 2)
>>> 

 

Şimdi anladım. Teşekkürler.
20,205 soru
21,729 cevap
73,289 yorum
1,890,729 kullanıcı