Project Euler 4. Problem Çözümü

aaahollyaa

Kilopat
Katılım
25 Şubat 2018
Mesajlar
280
Çözümler
2
Daha fazla  
Cinsiyet
Erkek
İyi günler, Project Euler'daki 4. problem için aşağıda da verdiğim gibi bir kod yazdım ama maalesef çalıştırdığımda bir sonuç alamıyorum. Amacımız 3 basamaklı 2 sayının çarpımıyla oluşturulabilecek en büyük palindrom (baştan ve sondan okunuşu aynı olan) sayıyı bulmak. Yanlış yaptığım yeri söyler misiniz? Teşekkürler.


C:
#include<stdio.h>
#include<stdlib.h>

int palindrommu(int n){
    int evetoyle=1;
    int basamaksayisi=0;
    int temp=n;

    for(;temp>0;){
        temp/=10;
        basamaksayisi++;
    }

    int* arr;
    arr=(int*)malloc(sizeof(int)*basamaksayisi);

    for(int i=0;n>=0;i++){
        *(arr+i)=n%10;
        n/=10;
    }

    for(int i=0,j=basamaksayisi-1;i<j;i++,j--){
        if(arr[i]!=arr[j]){
            evetoyle=0;
        }
    }
    free(arr);
    return evetoyle;
}

int main(){
   
    int enbuyuk=0;

    int p=999,q=999;

    for(;p>100;p--){
        for(;q>100;q--){
            if(palindrommu(p*q)){
                enbuyuk=p*q;
                break;
            }
        }
    }

    printf("%d",enbuyuk);
    return 0;
}
 
Son düzenleme:
int p=999,q=999;
Burası yanlış bir yere gitmiş. Bu şekilde 899 sayının (100-999) her biri için bir 899 koşul yaratmış olursun.Bu soru biraz matematik gerektiriyor. Önce palindrom sayıyı kavramak gerekiyor. Şöyle:

Palindrom sayılar abccba şeklinde yazılabilen sayılardır. Bu sayının çözümlemesini yaparsak:

  • 100000a+10000b+1000c+100c+10b+a
  • Yani sayımız 100001a+10010b+1100c
  • Bu sayıyı 11(9091a+910b+100c şeklinde yazabiliyoruz. Bu da demek oluyor ki sayımız 11 asal sayısının bir katı.
Bu adımlardan sonra, anlamamız gereken 100-999 aralığındaki 11'in katı olan sayıları bulmamız gerekiyor. Bu sayılar için 899 koşul kontrol etmemiz gerekiyor.

C bilmediğimden sorunu çözemiyorum. Algoritma olarak bakmak istersen Python çözümüm:
Python:
# Solution for biggest Palindromic number created by two 3-digit number

a = [x for x in range(101,1000) if x%11==0]
ctr=999
lastList = list()
while ctr>=100:
    for i in a:
        if str(ctr*i) == str(ctr*i)[::-1]:
            lastList.append(ctr*i)
    
    ctr -= 1
print(max(lastList))
 
Hocam öncelikle vakit ayırıp cevap yazdığınız için teşekkür ederim. Palindrom sayı hakkında dediklerinizi anladığımı düşünüyorum. Yazdığınız kodda bu bölüm tam olarak ne yapıyor? Açıklarsanız sevinirim.
Python:
        if str(ctr*i) == str(ctr*i)[::-1]:
            lastList.append(ctr*i)
 
Bu özelliğin C kısmında olup olmadığını bilmiyorum, fakat kısaca anlatmak gerekirse, if yapısı altında sayıyı string olarak kontrol ettim. (ctr*i) palindrom olup olmadığını kontrol ettiğimiz sayı.

str(ctr*i) ile sayıyı bir string'e dönüştürdüm. str(ctr*i)[::-1] ise stringi tersten yazdırmayı sağlayan bir yapı. Anlayacağınız if yapısı altında sayıyı string olarak alıp, tersi ile aynı olup olmadığını kontrol ettim. Eğer bu koşul doğruysa, lastList listesine sonucu ekledim.

print(max(lastList)) ifadesi de lastList listesindeki en büyük değeri döndürüyor.
 
@deleted 'in desteğiyle kodun son hali aşağıda. Sorunsuz çalışıyor.

C:
#include<stdio.h>
#include<stdlib.h>

int palindrommu(int n){
   
    int temp=n;
    int i=0;
    int basamak=0;

    while(temp){
        temp/=10;
        basamak++;
    }

    int* arr;
    arr=(int*)malloc(sizeof(int)*basamak);

    while(n){
        arr[i]=n%10;
        n/=10;
        i++;
    }

    i=0;
    int j=basamak-1;

    for(;i<j;i++,j--){

        if(arr[i]!=arr[j]){
            return 0;
        }
    }

    return 1;
}

int main(){
   
    int enbuyuk=0;
    int x=999,y=110;

    for(;x>99;x--){
        y=110;

        for(;y<1000;y+=11){

            if(palindrommu(x*y)){
                if((x*y)>enbuyuk){
                    enbuyuk=x*y;
                }
            }
        }
    }
    printf("3 basamakli sayilarin carpimindan olusan en buyuk palindrom: %d",enbuyuk);
    return 0;
}
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı