এই সি কোডটি আরও ছোট করা কি সম্ভব? এটি 0 থেকে 1000 পর্যন্ত সমস্ত প্রাইমগুলি মুদ্রণ করে।
সি, 89 অক্ষর
int i,p,c;for(i=2;i<1e3;i++){c=0;for(p=2;p<i;p++)if(i%p==0)c++;if(c==0)printf("%u\n",i);}
এই সি কোডটি আরও ছোট করা কি সম্ভব? এটি 0 থেকে 1000 পর্যন্ত সমস্ত প্রাইমগুলি মুদ্রণ করে।
সি, 89 অক্ষর
int i,p,c;for(i=2;i<1e3;i++){c=0;for(p=2;p<i;p++)if(i%p==0)c++;if(c==0)printf("%u\n",i);}
উত্তর:
59 57 বাইট
@ ফেয়ারসাম সলিউশনের ভিত্তিতে তবে প্রাথমিকতা পরীক্ষাটি আরও গল্ফ করা যেতে পারে
for(int p=1,d;d=p++%999;d||printf("%d\n",p))for(;p%d--;);
রানার 1212 এর মন্তব্যের ভিত্তিতে সম্পাদিত
d=p++%999
। অন্যথায়, এটি বেশ বায়ুচঞ্চল গল্ফিং কাজ দেখায়!
(আমি সিটিতে পূর্ণসংখ্যার আকারের সীমাবদ্ধতা অনুধাবন না করে এটি লিখেছিলাম, তাই কোডটি সংক্ষিপ্ত করার ক্ষেত্রে এটি সম্ভবত কার্যকরী নয়))
প্রথমত, অ্যালগরিদম সম্পর্কে একটি শব্দ। আপনার কোডটি গল্ফ করার আগে, ফলাফল পাওয়ার জন্য সর্বোত্তম সামগ্রিক কৌশল সম্পর্কে আপনার ভাবা উচিত।
আপনি ট্রায়াল বিভাজন করে primality চেক করছি - প্রতিটি সম্ভাব্য ভাজক পরীক্ষা p
এর i
। এটি অক্ষরে ব্যয়বহুল কারণ এটি দুটি লুপ লাগে। সুতরাং, লুপ ছাড়াই প্রাথমিকতার পরীক্ষা করা অক্ষর সংরক্ষণের সম্ভাবনা রয়েছে।
উইলসনের উপপাদ্যটি প্রায়শই সংক্ষিপ্ত পদ্ধতির ব্যবহার হ'ল : সংখ্যাটি n
প্রধান এবং যদি কেবলমাত্র হয়
fact(n-1)%n == n-1
কারণ fact
ঘটনা ফাংশন। আপনি সব সম্ভব পরীক্ষা করছি যেহেতু n
থেকে 1
থেকে 1000
, এটা চলমান পণ্য সম্পর্কে অবগত থাকার দ্বারা গৌণিক বাস্তবায়ন এড়াতে সহজ P
এবং তাই দিয়েই আপডেট P*=n
প্রতিটি লুপ পরে। এক মিলিয়ন পর্যন্ত প্রাইমগুলি মুদ্রণের জন্য এই কৌশলটির পাইথন বাস্তবায়ন এখানে ।
বিকল্পভাবে, আপনার প্রোগ্রামটি কেবলমাত্র 1000 পর্যন্ত হওয়া উচিত তা অন্য কৌশল খোলায় : ফেরমেট প্রাথমিকতা পরীক্ষা । কিছু জন্য a
, প্রতিটি প্রধান n
সন্তুষ্ট
pow(a,n-1)%n == 1
দুর্ভাগ্যক্রমে, কিছু সংমিশ্রণ কারও n
জন্য এই পরীক্ষায় পাস করে a
। এগুলিকে ফেরমেট সিউডোপ্রিম বলা হয় । তবে a=2
এবং a=3
একসাথে ব্যর্থ হবেন না n=1105
, সুতরাং আপনার প্রাইমগুলি 1000 এর আগে যাচাই করার উদ্দেশ্যে এটি যথেষ্ট a=2
।
pow(2,n-1)%n == 1 and pow(3,n-1)%n == 1
এটি 2 এবং 3 প্রাইমগুলি সনাক্ত করতেও ব্যর্থ হয়, সুতরাং সেগুলি বিশেষ-ক্ষেত্রেযুক্ত হওয়া দরকার।
এই পদ্ধতির কি সংক্ষিপ্ত? আমি জানি না কারণ আমি সি তে কোডিং করি না, তবে, কোডগুলি অক্ষরগুলি বের করা শুরু করার জন্য কোডের কোনও অংশে বসতি স্থাপন করার আগে সেগুলি চেষ্টা করা উচিত।
int
সেগুলি 32-বিট। একই ফেরতাদের জন্য যায়।
fact(int n, int m) { return (n==0) ? 1 : (n*f(n-1)) % m; }
তবে ফলাফলটি মোটামুটি বড় মানেরগুলির জন্য 32 বিট পূর্ণসংখ্যার উপচে পড়বে না n
। ( m
এটি মডিউলাস)
(n*fact(n-1,m)) % m
। যা সমস্যাটিকে হাইলাইট করে: আপনি বাস্তবায়নে পুনরাবৃত্তি এড়াতে পারবেন না fact
কারণ m
বাইরের লুপের প্রতিটি পুনরাবৃত্তির জন্য আলাদা হবে।
(স্রেফ অন্যান্য ভাষায় কিছু কৌশল শিখেছে applied
int i=0,p,c;for(;i<1e3;i++){c=0;for(p=2;p<i;)c+=i%p++<1;c||printf("%u\n",i);}
for(int i=0,p,c;i<1e3;i++){c=0;for(p=2;p<i;)c+=i%p++<1;c||printf("%u\n",i);}
একই প্রশ্নের আমার উত্তরটির আর একটি পুনরায় ব্যবহার ।
সম্পাদনা : একা একা কোড পিস, কল করার জন্য কোনও ফাংশন নেই।
for(int m,n=2;n<999;m>1?m=n%m--?m:n++:printf("%d\n",m=n));
সম্পূর্ণ প্রোগ্রাম:
n=2;main(m){n<999&&main(m<2?printf("%d\n",n),n:n%m?m-1:n++);}
অ্যালকিমিস্টের সমাধান দ্বারা অনুপ্রাণিত:
int i=1,p;for(;i++<1e3;p-i||printf("%d\n",i)){p=1;while(i%++p);}