আমাদের কথা খুঁজে নিন

   

রুট/বিগেইনার লেভেলের প্রোগ্রামিং প্রবলেমস : পর্ব-২ এর সলুশ্যন

তন্ময়-অন-রান.ব্লগস্পট.কম ০১. একটি বেসিক ক্যালকুলেটর। ______: একটি প্রোগ্রাম লিখুন যা ইনপুট হিসেবে ২ টি ইন্টিজার নাম্বার নিবে। অতপর ইনপুট হিসেবে অপারেটর (+,-,*,/) নিবে। যেই অপারেটর দেওয়া হবে ঐ দুটি নাম্বারের উপর সেই ক্যালকুলেশন করে আউটপুট দেখাবে। যেমন, নাম্বার হিসেবে যদি ১৫ আর ২৫ দেওয়া হয় এবং অপারেটর হিসেবে মাইনাস (-) চিহ্ন দেওয়া হয় তাহলে আউটপুট হবে -১০. সমাধান: এখানে দুটো ভ্যারিয়েবল a,b তে আমরা ইনপুট নিছি।

আর একটা ক্যারেক্টর টাইপ ভ্যারিয়েবল op তে আমরা অপারেটরকে ইনপুট নিছি। (লাইন ৮-১৫) এরপর, লাইন ১৭-২৬ এ চারটি অপারেটর এর জন্য আমরা ৪ বার op কে চেক করে দেখেছি যে তাতে কি আছে, সেই অনুযায়ী কন্ডিশনের নিচের লাইনে আউটপুট দিয়েছি। ০২. ৩ টি নাম্বারকে বড় থেকে ছোট করুন যারা কেউ কারো সমান নয় [এ্যারে ইউজ করা যাবে না]। ______: ৩ টি নাম্বার ৩ টি আলাদা ভ্যারিয়েবল এ নিতে হবে। নাম্বার ৩ টি কেউ কারো সমান দেওয়া হবে না।

আপনি আউট হিসেবে বড় থেকে ছোট ক্রমানুসারে তাদের দেখাবেন। যেমন ইনপুট যদি হয় ১৫, ৫, ২৫ তহালে আউটপুট দেখাবেন ২৫>১৫>৫. যারা হেল্প চান তারা নীচের ফ্লো-চার্ট টি ইউজ করতে পারেন *****[বড় করে দেখতে নিউ ট্যাব এ ওপেন করুন ছবিটিকে]***** সমাধান: এক্ষেত্রে আমি কিছুই বলবো না, ধরুন a,b,c এই তিনটি ভ্যারিয়েবলে ৩ টি ভ্যালু আমরা ইনপুট নিয়েছি। এখন উপরের ফ্লো-চার্টের সাথে নীচের ইফ..এলস গুলো মেলান। ০৩. ৩ টি নাম্বারকে বড় থেকে ছোট করুন যারা একে অপরের সমান হতে পারে [এ্যারে ইউজ করা যাবে না]। ______: ৩ টি নাম্বার ৩ টি আলাদা ভ্যারিয়েবল এ নিতে হবে।

নাম্বার ৩ টি একে অপরের সমান হতেও পারে নাও হতে পারে। আপনি আউটপুট হিসেবে বড় থেকে ছোট ক্রমানুসারে তাদের দেখাবেন। নীচের এক্সাম্পল গুলো দেখুন ইনপুট: ১৫ ৫ ২৫ আউটপুট: ২৫>১৫>৫ ইনপুট: ৫ ১৫ ৫ আউটপুট: ১৫>৫=৫ ইনপুট: ৫ ৫ ৫ আউটপুট: ৫=৫=৫ যারা হেল্প চান তারা নীচের ফ্লো-চার্ট টি ইউজ করতে পারেন *****[বড় করে দেখতে নিউ ট্যাব এ ওপেন করুন ছবিটিকে]***** সমাধান: এক্ষেত্রেও আমি কিছুই বলবো না, ধরুন a,b,c এই তিনটি ভ্যারিয়েবলে ৩ টি ভ্যালু আমরা ইনপুট নিয়েছি। এখন উপরের ফ্লো-চার্টের সাথে নীচের ইফ..এলস গুলো মেলান। ০৪. নির্দিষ্ট ব্যবধানের মধ্যেকার সবগুলো প্রাইম নাম্বার দেখান।

______: প্রাইম নাম্বার হচ্ছে সেগুলো যেগুলো ১ এবং সেই নাম্বার ছাড়া আর কোন নাম্বার দিয়ে নিঃশেষে ভাগ করা যায় না। ২ ডিফল্ট ভাবেই প্রাইম নাম্বার। ০ আর ১ কেনো প্রাইম না তা আমি জানি না। ৩ একটি প্রাইম কারণ ৩ কে ১ ও ৩ ছাড়া আর কোন নাম্বার দিয়ে নিঃশেষ ভাগ করা যায় না। এখানে আপনাকে প্রথমে দুটি নাম্বার দেওয়া হবে, ধরুন ১ এবং ১০. আপনার কাজ হবে ১ থেকে (১ সহ) ১০ পর্যন্ত (১০ সহ) নাম্বার গুলোর মধ্যে কোন গুলো প্রাইম তা আউটপুট এ দেখানো।

এক্ষেত্রে আউটপুট হবে ২,৩,৫,৭ সমাধান: সমস্যার বর্ণনাতেই বলা আছে প্রাইম নাম্বার কি। তাই আর বলছি না। এখন ভাবুন, একটি নাম্বার প্রাইম কিনা তা কিভাবে বের করা যায়? সেই নাম্বারটিকে ২ থেকে শুরু করে সেই নাম্বার আগ পর্যন্ত নাম্বারগুলো দিয়ে ভাগ করে করে দেখতে হবে যে কোন নাম্বার দিয়ে ভাগ করলে ভাগফল শূণ্য হয়ে যাচ্ছে কিনা, যদি শূণ্য হয় তাহলে প্রাইম না কারণ প্রাইমকে ১ এবং প্রাইম নিজে ছাড়া আর কেউ নিঃশেষে ভাগ করতে পারে না। ওকে ধরুন টেস্ট নাম্বারটি ৩২০০০, তারমাণে এটা প্রাইম কিনা তা জানতে আপনাকে সর্বোচ্চ ২৯৯৯৮ টি mod অপারেশন করতে হবে। ওকে, তা করতে হবে না, কারণ কোন সংখ্যাকে তার অর্ধেকের চেয়ে বড় কোন সংখ্যা দিয়ে ভাগ করলে কখনোই তা পূর্ণ সংখ্যা হবেও না, ভাগশেষ দেখার দরকারই নাই।

তারমানে ৩২০০০ কে আমরা টেস্ট করবো ২-(৩২০০০/২) অর্থাৎ ২-১৬০০০ পর্যন্ত সংখ্যা দিয়ে ৩২০০০ এর উপর mod অপারেশন চালাবো। কিন্তু তাও এই সংখ্যা অনেক বেশি। আরো কমাতে হবে। ওকে, কোন সংখ্যা যদি প্রাইম না হয় তাহলে তার স্কয়ার রুট এর ছোট অথবা সমান কোন নাম্বার দিয়ে তা অবশ্যই নিঃশেষে ভাগ যাবে। ৩২০০০ এর স্কয়ার রুট ১৭৮.৮৮৫৪, এখান থেকে শুধু ইন্টিজার অংশটি নিন অর্থাৎ ১৭৮. তারমানে ২-১৭৮ পর্যন্ত সংখ্যা দিয়ে আমরা ৩২০০০ এর ওপর mod অপারেশণ চালালেই পেয়ে যাবো যে প্রাইম কিনা।

প্রাইম না হলে ২-১৭৮ এর মধ্যেই কোন না কোন নাম্বার দিয়ে ৩২০০০ নিঃশেষে বিভাজিত হবে। এই ব্যাপারটাকেই আমরা কোড করছি। প্রথমে start, end এই দুটোর মধ্যে শুরুর আরে শেষের নাম্বার নিলাম, এটাই আমাদের রেঞ্জ। ১৩ নম্বর লাইনে মূল কাজ শুরু হলো। prime=1 করার মাধ্যমে আমরা ধরে নিচ্ছি যে বর্তমান i একটি প্রাইম।

যদি শেষ পর্যন্ত prime=1 ই থাকে তারমানে i একটি প্রাইম হবে। এরপর temp = sqrt(i); এর মাধ্যমে আমরা বর্তমান i এর স্কয়াররুট বের করে তা temp নিচ্ছি। তারপর, ঐ যে বললাম, ২ থেকে স্কয়াররুট পর্যন্ত নাম্বার দিয়ে টেস্ট করবো, সেই জন্যই দেখুন ১৮ নম্বর লাইনের লুপটি ২ থেকে temp পর্যন্ত চলছে। যদি কোন j দিয়ে i নিঃশেষে ভাগ যায় তাহলেই prime = 0; করে আমরা বেরিয়ে যাচ্ছি এই লুপ থেকে। (লাইন ২০-২৪). এরপর ২৬ নং লাইনে আমরা দেখছি যে prime=1 আছে কিনা এবং বর্তমান i ০ অথবা ১ কিনা, যদি prime=1 না হয় তাহলে তো কথাই নেই, বুঝাই যাচ্ছে যে প্রাইম না।

আর যদি i এর মাণ ০ অথবা ১ হয় তাহলে ব্যাপারটা হলো যে এদেরকে প্রাইম বলা হয় না, তাই এদের ক্ষেত্রে যদি prime=1 হয়ও তবু আমরা সেটাকে প্রিণ্ট করবো না। একটি i এর কাজ হলে আমরা নেক্সট i এ যাবো। এভাবে প্রতিটি i কে চেক করে দেখবো যে তা প্রাইম কিনা। ------------------------------------------------------------------------- পর্ব-১ এর সলুশ্যন এর লিংক 'প্রোগ্রামারস হাব' গ্রুপ এর লিংক ।

অনলাইনে ছড়িয়ে ছিটিয়ে থাকা কথা গুলোকেই সহজে জানবার সুবিধার জন্য একত্রিত করে আমাদের কথা । এখানে সংগৃহিত কথা গুলোর সত্ব (copyright) সম্পূর্ণভাবে সোর্স সাইটের লেখকের এবং আমাদের কথাতে প্রতিটা কথাতেই সোর্স সাইটের রেফারেন্স লিংক উধৃত আছে ।