Şimdi Ara

0-1000 arası emirp sayıları listeleyen kod yazınız

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
12
Cevap
0
Favori
291
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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ı >



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

  • 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ı >
  • Kod

    Yığını:
    // 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





  • Aelthalyste kullanıcısına yanıt
    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ı >
  • Kod

    Yığını:
    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));
  • Gökşen PASLI G kullanıcısına yanıt

    Güzel fakat Raku ile cok kısa ve net tek satır:


    Kod

    Yığını:
    say grep { $_.is-prime and $_.flip.is-prime and not ($_ eq $_.flip) }, 1..1000;
  • 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

  • C++14 kullansanız, Raku'daki kodu nerdeyse aynısını direkt C++'a portlayabilirsiniz isPrime ve ReverseNumber senin kodlardan direk alıntı)


    Kod

    Yığını:
      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.

  • C++ çözümünü 7 'den 3 satıra indirdim :)



    Kod

    Yığını:
      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);});
  • Kod

    Yığını:
    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.

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.