Üç farklı sayıyı bulma

ÜÇ farklı rakamları farklı sayı için şunlar biliniyor;
iki sayının çarpımı üçüncüyü veriyor.
çarpılan iki sayıdan biri diğerini bölüyor.
ve aynı zamanda bu üç sayıda rakamların hepsi kullanılmış olmalı (örnek: 987*65 eşittir 43210)gibi
BU ŞARTI SAĞLAYAN SAYI ÜÇLÜSÜ SORULUYOR

Cevabı paylaşıyorum amaç bu cevabı bulcak kodu yazmaktır.27*594=16038

Ben de cevabları paylaşıyorum :slightly_smiling_face:

[[594, 27, 16038], [17082, 3, 5694], [20457, 3, 6819], [20754, 3, 6918], [21658, 3094, 7], [8169, 3, 24507], [27504, 3, 9168]]

Ben bu kodu daha dün yazmıştım ama çalışması biraz uzun sürüyor diye atmamıştım. Şimdi 5dk açık bıraktım tamamlandı.

import itertools

ayıraçlar = list(itertools.combinations(range(10), 2))

sayı_listesi = [str(i) for i in range(10)]

sayı_grupları = itertools.permutations(sayı_listesi, 10)

durum = [0, 0, 0]

sonuç = []

sayaç = 0

for sayılar in sayı_grupları:
    sayaç += 1

    for ayıraç in ayıraçlar:
        
        try:
            durum[0] = int("".join(sayılar[:ayıraç[0]]))
            durum[1] = int("".join(sayılar[ayıraç[0]:ayıraç[1]]))
            durum[2] = int("".join(sayılar[ayıraç[1]:]))
        except ValueError: continue

##        print(durum)
        
        geç = 0
        for i in durum:
            if i==0:
                geç = 1
                break

        if geç: continue
            
        if durum[0] * durum[1] == durum[2]:
            if durum[0] % durum[1] == 0 or durum[1] % durum[0] == 0:
                sonuç.append(durum.copy())
                continue

        if durum[0] * durum[2] == durum[1]:
            if durum[0] % durum[2] == 0 or durum[2] % durum[0] == 0:
                sonuç.append(durum.copy())
                continue

        if durum[2] * durum[1] == durum[0]:
            if durum[2] % durum[1] == 0 or durum[1] % durum[2] == 0:
                sonuç.append(durum.copy())
                continue

#def rakamlarıfarklı(ilk,son):
 #   liste=[]
  #  for i in range(ilk,son+1):
   #     if len(set(str(i)))==len(str(i)):
    #        liste.append(i)
    #return len(liste)

    # kullan yukardaki fonksiyon yardımıyla bulunur.1den 100000 e kadar olan rakamları farklı sayıları bulmak yeterli
for i in kullan:
    for j in kullan:
        if i%j==0:
            if len((str(i)+str(j)))==len(set(str(i)+str(j)) ):
                for k in kullan:
                    if len(str(i)+str(j)+str(k))==10:
                        if  i*j==k :

                            if len((str(i)+str(k)))==len(set(str(i)+str(k))):
                                if len((str(j)+str(k)))==len(set(str(j)+str(k))):
                                    print(i,j,k)

Bunu nasıl buldunuz?

Yukarıdaki kodda açıklama kısmında belirttim

Ben de bunun yeterli olduğunu neye dayanarak söylediğinizi sordum?

Çarpımdaki iki sayıdan biri en fazla 4basamklı olabilir.5basamaklı olsa sonuçta en az5basamklı olur diğerine sayı kalmaz

Bana çok geçerli bir düşünce gibi gelmedi ama

>>> 98*765
74970

İşlemi sonucunda geriye kalmış olan 43210 sayısından daha büyük sonuç elde ediyoruz.

Şunu demek istiyorum rakamları farklı sayılar oluşturuyoruz elimizde 10adet rakam var
Eğer çarpanlardan birine 5basamaklı dersek
Sonuçta 5basamklı veya daha fazla olmalı hepsi bitti ama diğer çarpana hiç bişey kalmadı demekki çarpanlar 5ten az basamaklı

1 Beğeni

Eğer çarpanlar 4 ve 1basamaklı ise en fazla sonuç en fazla 5 basamaklı
Eğer çarpanlar 3ve2 ise yine sonuç en fazla 5 basamaklı
Eğer çarpanlar 3 ve 3 olsa sonuç4 basamaklı olması gerekir buda matematiksel olarak mümkün değil
İnşallah açıklaya bilmişimdir

1 Beğeni

kodu revize ederek daha hızlı çalışanını yazdım

#def rakamlarıfarklı(ilk,son):
 #   liste=[]
  #  for i in range(ilk,son+1):
   #     if len(set(str(i)))==len(str(i)):
    #        liste.append(i)
    #return len(liste)

    # kullan yukardaki fonksiyon yardımıyla bulunur.1 ile 100000 arasındaki sayıları bulsak yeterli
for i in kullan:
    for j in kullan:
        if i%j==0:
            if len((str(i)+str(j)))==len(set(str(i)+str(j)) ):
                k=i*j
                if k in kullan:
                    if len(str(i)+str(j)+str(k))==10:
                            if len((str(i)+str(k)))==len(set(str(i)+str(k))):
                                if len((str(j)+str(k)))==len(set(str(j)+str(k))):
                                    print(i,j,k)