S-sayıları mükemmel karekök olarak tanımlanan doğal sayılardır. Karekök sonucunda elde edilecek değer ile karekök içindeki değerin 2 veya daha fazla değere ayrılarak toplanmasıyla elde edilen değere eşittir.yani şöyle sayının basamaklarının toplamı köküne eşit olucak şekilde. Örneğin; .
81 bir S-sayısıdır √81=8+1
6724 bir S-sayısıdır √6724=6+72+4
8281 bir S-sayısıdır √8281=8+2+81=82+8 +1
9801 bir S-sayısıdır √9801=98+0+1
örnekte olduğu gibi 1 ile 9999 arasındaki bulunan tüm mükemmel karekök olan S-sayılarını alt alta yazdıran C programını yazınız.
Hocam başka bir forumda yine aynı ödevi görmüştüm. Python ile yazdım ben işine yararsa buyur
import math #Kök almak için math modülünü içeri aktardık
tamkareler = [] #tam kare sayıları almak için bir liste oluşturduk çünkü S- sayıları sadece tam kare sayılar için geçerli. Diğer tür sayılar kök dışına ondalıklı sayı olarak (float) çıkar. Kök içindei sayılarıda toplayarak ondalıklı sayı elde edemeyiz
for i in range(1,10000): #1 den 9999a kadar olan sayıların her biri için aşşağıdakileri yaptık
sayi = math.sqrt(i) #i sayısının karesini sayi değişkenine aktardık
if len((str(sayi)))<=4: #eğer sayi değişkeninin karakter uzunluğu 4 ten büyük değilse aşşağıdakileri yaptırdık. Sebebide 9999 a kadar olan en büyük tam kare sayının karekökü 99dur. Ama her değer floata dönüştüğü için şöyle bir çıktı geliyor: 99.0 gibi. O yüzden 4 haneyi geçerse bir float değerdir yani herhangi bir sayının karekökü değildir. Not: Float olması demek, tam kare olmayan bir sayının karekökünü almışız demek
# print(f"{sayi} -> {i}") #görebilmek için yazdırdık
tamkareler.append(int(i)) #tamkareler listemize bulduğumuz tam kare leri ekledik
sonuçlar = []
for i in tamkareler:
uzunluk = len(str(i))
if uzunluk == 2:
birinci_hane = int(str(i)[0])
ikinci_hane = int(str(i)[1])
sonuc = math.sqrt(i)
if sonuc == birinci_hane+ikinci_hane:
sonuçlar.append(i)
if uzunluk == 3:
birinci_hane=int(str(i)[0])
ikinci_hane=int(str(i)[1])
üçüncü_hane=int(str(i)[2])
ilk_iki_hane=int(str(i)[0:2])
son_iki_hane=int(str(i)[1:3])
sonuc = math.sqrt(i)
if sonuc == birinci_hane+ikinci_hane:
sonuçlar.append(i)
elif sonuc== ikinci_hane+üçüncü_hane:
sonuçlar.append(i)
elif sonuc== birinci_hane+üçüncü_hane:
sonuçlar.append(i)
elif sonuc==ilk_iki_hane+üçüncü_hane:
sonuçlar.append(i)
elif sonuc== birinci_hane+son_iki_hane:
sonuçlar.append(i)
if uzunluk == 4:
bir=int(str(i)[0])
iki=int(str(i)[1])
üç=int(str(i)[2])
dört = int(str(i)[3])
ilk_iki=int(str(i)[0:2])
son_iki=int(str(i)[2:4])
ilk_üç =int(str(i)[0:3])
son_üç =int(str(i)[1:4])
sonuc = math.sqrt(i)
if sonuc == bir:
sonuçlar.append(i)
elif sonuc == iki:
sonuçlar.append(i)
elif sonuc == üç:
sonuçlar.append(i)
elif sonuc == dört:
sonuçlar.append(i)
elif sonuc == bir+iki:
sonuçlar.append(i)
elif sonuc == bir+üç:
sonuçlar.append(i)
elif sonuc == bir+dört:
sonuçlar.append(i)
elif sonuc == iki+üç:
sonuçlar.append(i)
elif sonuc == iki+dört:
sonuçlar.append(i)
elif sonuc == üç+dört:
sonuçlar.append(i)
elif sonuc == bir+iki+üç:
sonuçlar.append(i)
elif sonuc == bir+üç+dört:
sonuçlar.append(i)
elif sonuc == iki+üç+dört:
sonuçlar.append(i)
elif sonuc == bir+iki+üç:
sonuçlar.append(i)
elif sonuc == bir+iki+üç+dört:
sonuçlar.append(i)
#
elif sonuc == ilk_iki+son_iki:
sonuçlar.append(i)
elif sonuc == ilk_iki+üç:
sonuçlar.append(i)
elif sonuc == ilk_iki+dört:
sonuçlar.append(i)
elif sonuc == ilk_iki+üç+dört:
sonuçlar.append(i)
elif sonuc == son_iki+bir:
sonuçlar.append(i)
elif sonuc == son_iki+iki:
sonuçlar.append(i)
elif sonuc == son_iki+bir+iki:
sonuçlar.append(i)
elif sonuc == ilk_üç+dört:
sonuçlar.append(i)
elif sonuc == son_üç+bir:
sonuçlar.append(i)
#
elif sonuc == ilk_iki:
sonuçlar.append(i)
elif sonuc == son_iki:
sonuçlar.append(i)
elif sonuc == ilk_üç:
sonuçlar.append(i)
elif sonuc == son_üç:
sonuçlar.append(i)
print(sonuçlar)
Merhabalar elinize sağlık.
Kodun okunabilirligi acısından tanımladığınız değişkenleri import ettiğiniz modullerin hemen alt kısmına yazmalısınız.
Kaynak: Pep-8
Ayni kodlar surekli tekrar ediyor, kodlar sosyal mesafeyle yazilmis.
1 Beğeni
def splitter(sequence):
for i in range(1, len(sequence)):
start = sequence[0:i]
end = sequence[i:]
yield (start, end)
for split in splitter(end):
result = [start]
result.extend(split)
yield result
answers = []
for root in range(0, 100):
number = root**2
for j in splitter(str(number)):
if sum(map(int, j)) == root:
answers.append(number)
break
print(answers)
C’de yield olmadığı için daha farklı yazmamız gerekebilir.
@ertugrulcakici kodunuz yanlış çalışıyor.
c lazım hocam c yazabilecek yok mu
sorunun cevabı, kodu bu mu hocam?
Kod istediğiniz cevabı veriyor.
teşekkür ederim hocam
Evet sonradan farkettim hocam soruyu yanlış anlamışım. Ben tüm sayıları işleme sokma zorunluluğumuz yok sanıyordum. mesela 289 dışarı 17 olarak çıkıyor. 8 ve 9 u toplayarak 17 elde edebiliyoruz sanıyordum.