< Bu ileti mini sürüm kullanılarak atıldı > |
0-1000 arası emirp sayıları listeleyen kod yazınız
-
-
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ı > -
// 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; }
Kod
Yığını:kisa bi goz atinca iskaladigi bir sey goremiyorum, performansi hakkinda konusulacak cok sey var tabii ki. sizin yorumlarinizi bekliyorum oncelikle
-
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ı > -
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));
Kod
Yığını: -
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;Kod
Yığını: -
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ı)
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';Kod
Yığı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 :)
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)]
Kod
Yığını: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.
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X