Arama butonu
Bu konudaki kullanıcılar: 1 misafir
10
Cevap
283
Tıklama
0
Öne Çıkarma
0-1000 arası emirp sayıları listeleyen kod yazınız
T
4 yıl
Yarbay
Konu Sahibi

emirp sayı ters yazılışı kendisine eşit olan fakat palindromik olmayan asal sayıdır.

https://en.wikipedia.org/wiki/Emirp

0-1000 arası emirp sayıları listeleyen kod yazınız
Kullandığınız derleyicide yerleşik asal sayı check fonksiyonu varsa kullanabilrsiniz.

Not: Soru ödev sorusu değildir. Kod egzersizi ve söyleşi amaçlıdır.
Not2: Bu konuyu 'sohbet' bölümüne açtım fakat konum gözükmedi dolayısıyla 1 gündür kimse görmedi. o yüzden konuyu burada açtım.



< Bu ileti mini sürüm kullanılarak atıldı >

P
4 yıl
Yarbay

seninle el ele veren dünyayı ele geçirir :D



T
4 yıl
Yarbay
Konu Sahibi

Konu söyleşi amaçlıdır demem yanlış anlaşılmasın

Önce kod, sonra söyleşi.



< Bu ileti mini sürüm kullanılarak atıldı >

A
4 yıl
Binbaşı

// karalama yaptigim projenin icerisinde yazdim, ney nereden geliyor tam emin degilim eksik kaldikca yazilir

#include <stdio.h> // printf icin
#include <math.h> // sanirim sqrt buradaydi

#define DH_UNINITIALIZED -1
#define DH_PRIME 1
#define DH_NOT_PRIME 0

inline BOOLEAN
IsPrime(unsigned int n){

    if(n % 2 == 0) return FALSE;

    unsigned int floor = (unsigned int)sqrt(n);
    for(unsigned int i = 3; i < floor; i+=2){
        if(n % i == 0){
            return FALSE;
        }
    }

    return TRUE;
}

inline unsigned int
ReverseNumber(unsigned int Number){
    unsigned int ReversedNumber = 0;
    while(Number > 0){
        ReversedNumber = ReversedNumber*10 + Number % 10;
        Number = Number / 10;
    }
    return ReversedNumber;
}

int main(){
unsigned int Semirp[256];
    memset(Semirp, DH_UNINITIALIZED, sizeof(Semirp));

    int Primes[1000];
    memset(Primes, DH_UNINITIALIZED, sizeof(Primes));

    unsigned int SemirpIndex = 0;

    for(unsigned int n = 11; n < 1000; n+=2){

        if (Primes[n] != DH_UNINITIALIZED) {
            continue;
        }

        if(IsPrime(n)){
            
            Primes[n] = DH_PRIME;

            unsigned int R = ReverseNumber(n);

            Primes[R] = IsPrime(R) ? DH_PRIME : DH_NOT_PRIME;

            if (R > n && Primes[R] == DH_PRIME) {
                Semirp[SemirpIndex++] = n;
                Semirp[SemirpIndex++] = R;
            }

        }
        else{
            Primes[n] = DH_NOT_PRIME;
        }

    }

    for(int i = 0; i< SemirpIndex; i+=2){
        printf("%i\t%i\n", Semirp[i], Semirp[i+1]);
    }
    
    return 0;
}
kisa bi goz atinca iskaladigi bir sey goremiyorum, performansi hakkinda konusulacak cok sey var tabii ki. sizin yorumlarinizi bekliyorum oncelikle


Bu mesaja 1 cevap geldi.
T
4 yıl
Yarbay
Konu Sahibi

Oldukça uzun bir kod. isPrime ve reverse fonksiyonlarını hariç tutsak bile boş satırsız 27 satır kod var. Klasik C++ kullanmışsınız. C++11 ve yukarısındaki 'lambda' özelliklerini kullanarak o 27 satır 3-5 satıra düşürülebilir.

Orta çaplı bir proje geliştirirken 5 satırda yapılabilecek şeyi 25 satırda yapsanız o proje ciddi şekilde zorlaşır. Bu şekilde kod sadece hobi amaçlı deil gerçek projelerde de ciddi sorun oluşturur.



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Aelthalyste
G
4 yıl
Yarbay

bool asalmı(int sayı) => Enumerable.Range(1, sayı).Where(x => sayı % x == 0).SequenceEqual(new[] { 1, sayı });
Enumerable.Range(1, 1000).Where(z => z.ToString()!=new string(z.ToString().Reverse().ToArray()) && asalmı(z) && asalmı(int.Parse(new string(z.ToString().Reverse().ToArray())))).ToList().ForEach(z=>Console.WriteLine(z));


Bu mesaja 1 cevap geldi.
T
4 yıl
Yarbay
Konu Sahibi

Güzel fakat Raku ile cok kısa ve net tek satır:
say grep { $_.is-prime and $_.flip.is-prime and not ($_ eq $_.flip) }, 1..1000;




Bu mesajda bahsedilenler: @Gökşen PASLI
A
4 yıl
Binbaşı

Yogun sekilde scripting dilleri kullanmiyorum sizin gibi hocam(birkac konunuza daha denk geldigim icin boyle bir varsayimda bulundum), benim icin oldukca anlasilir ve net bir kod acikcasi. Modern C++ ile bir sure calismistim fakat verimliligimi dusurunce eski C++ stiline geri dondum. Dilin kendisi ile bogusmayi cok sevmiyorum acikcasi, kafamdan gectigi gibi kodu yazabildigim surece verimliligimi bir seviyede tutabilirim


Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @vonderplanitz
T
4 yıl
Yarbay
Konu Sahibi

C++14 kullansanız, Raku'daki kodu nerdeyse aynısını direkt C++'a portlayabilirsiniz isPrime ve ReverseNumber senin kodlardan direk alıntı)
  vector<int> a(1000);
  iota(begin(a), end(a), 1);
  vector<int> b(a.size());
  // Raku'dan alıntı: say grep { $_.is-prime and $_.flip.is-prime and not ($_ eq $_.flip) }, 1..1000;  
  auto end = copy_if(cbegin(a), cend(a), begin(b),
             [](int x) { return isPrime(x) & isPrime(ReverseNumber(x)) & !(ReverseNumber(x) == x); });
  b.erase(end, b.end());
  for (auto n: b)
    cout << n << '\n';
Sadece 7 satır ki o vektörü kopyalayarak ve kopyalanan vektördeki fazla alanı erase ile temizleyerek yaptığım için, onları da yapmasam 3-4 satırda halledilebilecek birşey.



T
4 yıl
Yarbay
Konu Sahibi

C++ çözümünü 7 'den 3 satıra indirdim :)
  vector<int> a(1000);
  iota(begin(a), end(a), 1);
  copy_if(cbegin(a), cend(a), std::ostream_iterator<int>(std::cout, "\n"),[](int x) { return isPrime(x) & isPrime(ReverseNumber(x)) & !(ReverseNumber(x) == x);});



H
4 yıl
Binbaşı

isp = lambda x: sum([1 if x%i==0 else 0 for i in range(2,x)])==0
[print(i) if (isp(i) and isp(int(str(i)[-1::-1])) and str(i)!=str(i)[-1::-1]) else 0 for i in range(1000)]
2 satir python kodu. Kutuphane kullanarak ya da isp fonksiyonu alta alinarak 1 satira inebilir.Bir de sorunun taniminda hata var wikipedideki tanima gore yaptim.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.