Bir Tam Sayıyı, Üslü bir sayıya çevirebilir miyim?

Bir hesap makinesi yazdım. Olağanın dışında olarak bir üslü sayıya çevirme butonu ekledim.
Designer’dan arayüzü tasarladım.
Eklediğim butonlar vs. işlevlerini de tamamladım.
Sadece bu kaldı.

S** butonu bu işe yarayacak.
Bir tam sayıyı üslü bir sayıya çevirmek mümkün müdür ?

eğer algoritmanı oluşturursan neden olmasın.sorun algoritma

8 sayısını 2 üzeri 3 olarak yazabilecek bir algoritma lazım.

x=x**1

fakat 8 yazdığımda 2’nin küpü şeklinde yazabilmesini istiyorum.
Bir algoritma yapılabilir sanırım bunun için. Fakat nasıl yapılabileceğini bulamadım.

8=2**math.log2(8)

1 Beğeni

Merhaba,
Bir sayının herhangi bir tabandaki üssünü bulmak için de

logn(x) = log(x) / log(n)

Math kütüphanesinde sadece log2 ile log var diye biliyorum.

log = log10

edit: log = log10 ifadesini python3 'ün math kütüphanesi için kullanmadım. Bu ifade , matematik literatürü için geçerlidir.

1 Beğeni

Yanlış anlamadıysam şöyle bir şey olacak.

import math

x = int(input("gir"))
x = 2**math.log2(8)

print(x)

Fakat bu bana girdiğin 8 değerini yine 8.0 olarak döndürüyor.
9 yazdığımda da yine 8.0 döndürüyor

Peki mesela 81 sayısı için nasıl bir üslü ifade gösterimi olacak? 3^4 mü 9^2 mi?

Şöyle yapsanız olur mu?

#!/usr/bin/python3.8
# -*- coding: utf-8 -*-

import math


def uslu_ifade(x):
    count = 2
    while (y := math.log(x, count)) != int(y):
        count += 1
    return f"{count}^{int(y)}"


for i in [2, 4, 9, 16, 27, 81]:    
    print(uslu_ifade(i))

Çıktı:

2^1
2^2
3^2
2^4
3^3
3^4
1 Beğeni

Zaten yukarıdaki gönderimde kodunda kullandığın kısmın 8'e eşit olduğunu yazmışım:

Kullanıcıdan alınan x değerini kullanmıyorsunuz.

Bu arada superscript de kullanabilirsiniz:

#!/usr/bin/python3.8
# -*- coding: utf-8 -*-

import math

superscript = {
    "0": "\u2070",
    "1": "\u00b9",
    "2": "\u00b2",
    "3": "\u00b3",
    "4": "\u2074",
    "5": "\u2075",
    "6": "\u2076",
    "7": "\u2077",
    "8": "\u2078",
    "9": "\u2079"
}


def get_superscript(x):
    return "".join(superscript[i] for i in str(x))
    

def exponential_expression(x):
    count = 2
    while (y := math.log(x, count)) != int(y):
        count += 1
    return f"{count}{get_superscript(int(y))}"

    
print(exponential_expression(1024))

Çıktı:

2¹⁰
2 Beğeni

SuperScript tam işine yarayacak olan şey sanırım.
Şuan telefondayım.
Kısa sürede dönüş yapmaya çalışacağım.
Şimdiden teşekkür ederim.

superscript yönteminiz başarılı bir şekilde çalıştı. Fakat bunu hesap makinesine nasıl entegre etmeliyim ?

lineEdit bildiğiniz gibi str değerler alabiliyor.
Yanılmıyorsam bununla ilgili bir hata :

sanırım

bu satırı bu şekilde yazdığım için python a = eval(exponential_expression(x = self.lineEdit.text()))

"
while (y := math.log(x, count)) != int(y):
TypeError: must be real number, not str
"
böyle bir hata veriyor.

Ekran görüntüsü 2020-10-08 192025

buradaki toplama işaretini mesela basit bir şekilde lineEdit’e yazdırıyordum.
Daha sonra “=” butonu ile eval yardımı kullanarak hesaplatıp lineEdit’e bastırabiliyordum.

Fakat bu sefer bu kadar basit olmayacak anlaşılan.


Bu satırları yazmamın ne kadar saçma olduğunu söyleyebilirsiniz. Haklısınız. Sadece denemek istemiştim.

Kısacası sorun şuanda, yönteminizdeki integer değerlerin lineEdit’e geçmesine uyacak şekilde entegre etmek.

Kendim bir şeyler kurcalamaya çalıştım fakat işe yaramadı.

aslında şimdi şöyle bir şey denedim.

Fakat lineEdit’e 9 yazdırıp S** butonuna bastığımda 253 sayısını verdi.
Neyi yanlış yaptım ?

sanırım direkt “y” değişkenini almamalıydım. Hata olsa çalışmazdı.

eval'i kullanmanıza gerek yok, zaten string bir değer dönüyor.

sonrasında eval kullanmadan bir şey denedim zaten.
Fakat bunda sanırım yanlış bir değeri aldım.

Hemen üstte anlattım bunu

Orada bir yanlışlık yapmışsınız zaten. y = self.y gibi bir şey yazmışsınız. return edildikten sonra fonksiyon içine ne yazarsanız yazın çalışmaz zaten.

a = exponential_expression(x=self.lineEdit.text())
self.lineEdit.setText(a)

yazınca çalışıyor mu?

Yani 9 a bastığınız zaman hangi değişkenden bu değeri alacağınızı bulmalısınız ve sonra da bu değeri int'e çevirip, exponential_expression'a argüman olarak vermelisiniz. Dönen değeri de sonuç ekranıyla alakalı widget hangisi ise ona argüman olarak paslamalısınız.

haklısınız bu detayı unutmuşum.

bu şekilde yazdım ve bu hatayı veriyor :

(burayı belirtiyor önce)
a = exponential_expression(x=self.lineEdit.text())

while (y := math.log(x, count)) != int(y):
TypeError: must be real number, not str

bu söylediğiniz kısım için yarın dönüş yapmaya çalışacağım.
Şimdi uğraşmaya kalksam, acil yapmam gereken şeyler var.
Tekrar yardımlarınız için teşekkür ederim.

Muhtemelen argüman olarak verdiğiniz değeri integer'a dönüştürmediniz. Widget’ten aldığınız bir string verisi sanırım.