পোস্টটি পড়া হয়েছে 261 বার
UVa 10931 Parity Solution in Bengali

অনলাইন জাজ সিরিজ – ১৩ [UVa 11332 – Summing Digits]

খুব সিম্পল একটা প্রবলেম। নিচের লিংক থেকে প্রবলেমটা পড়ে ফেলো। ওখানে লেখা আছে যে তোমাকে একটা নাম্বার দেয়া আছে। এই নাম্বারের ডিজিটগুলোর যোগফল বের করতে হবে। এই যোগফল বের করার কাজ একবার না, মোট তিন বার করতে হবে।

UVa 11332 – Summing Digits

কোনো একটা সংখ্যা n = 47 হলে এর ডিজিটগুলোর যোগফলের ফাংশন f(n) হলে আমাদের কাজ হবেঃ

f(n) = f(47) = 4 + 7 = 11
এই f(n) এর রেজাল্টকে এবার n ধরে আবারো f(n) ফাংশনের কাজ করতে হবে।

f(n) = f(11) = 2

এই ফলাফলকে এবার n ধরে আবারো f(n) করা হলে উত্তর আসেঃ f(n) = f(2) = 2 [যেহেতু একটাই মাত্র ডিজিট ২, তাই এর যোগফলও ২]

তার মানে আমাদের হাতে প্রথমে থাকা একটা সংখ্যাকে তিনবার একটা ফাংশনের মধ্য দিয়ে নিতে হয়েছে। মূল কাজটা হয়েছে f(f(f(n))). একদম ভিতরের f() এর রেজাল্ট 11, এর বাইরের f() এর রেজাল্ট 2 ও সবার বাইরের f() এর রেজাল্টও 2. এটাই আউটপুট।

Solution

কাজটা কিভাবে করা যায়? পুরো প্রবলেমকে যদি ছোট ছোট অংশে ভাগ করিঃ
১। সংখ্যার ডিজিটগুলোকে আলাদা আলাদা করা
২। আলাদা হওয়া ডিজিটগুলোকে যোগ করা

যেই যোগফল বের হবে সেটাকে আবার উপরের দুইটা প্রসেসের মধ্য দিয়ে নিয়ে যাওয়া। এরপর যে রেজাল্ট বের হবে সেটাকেও আবার উপরের দুইটা ধাপ অতিক্রম করালেই কাংক্ষিত আউটপুট পাওয়া যাবে।

123 % 10 = 3. অর্থাৎ কোনো সংখ্যাকে ১০ দিয়ে Mod (ভাগশেষ) করলে ঐ সংখ্যার শেষ ডিজিটটা পাওয়া যায়।
123 / 10 = 12. অর্থাৎ কোনো সংখ্যাকে ১০ দিয়ে ভাগ করলে ঐ সংখ্যার শেষ ডিজিটটা ভ্যানিশ হয়ে যায়।

এই দুইটা অপারেশনের মাধ্যমে কিন্তু যে কোনো সংখ্যার সবগুলো ডিজিট আলাদা আলাদা করে বের করে ফেলা সম্ভব। লজিকটা হবে প্রথমে n-কে ১০ দিয়ে মড করব। এই মানটা কোথাও রাখব। এরপর n কে ১০ দিয়ে ভাগ করে আবার n এর মধ্যেই assign করব (n=n/10)। এই কাজটা করতেই থাকব, যতক্ষণ পর্যন্ত n এর মান শূন্য না হয়। শূন্য হয়ে গেলে এই মড আর ভাগের কাজ শেষ করব।

মড আর ভাগের কাজ মোট ৩ বার করা লাগবে। তাই একই কোড তিনবার না লিখে এই প্রসেসটুকু একটা ফাংশনের মধ্যে লিখে ফেলি। main() function থেকে এই ফাংশনকে ৩ বার কল দিব। তাহলেই কাজ হয়ে যাবে।

n কে ১০ দিয়ে ভাগ করতে থাকলে এক সময় n এর মান হয়ে যাবে শূন্য। তখন loop break করে res এর মান রিটার্ন করে দিবে main() function এর কাছে।

main function এ চাইলে a, b, c তিনটা ভেরিয়েবল রাখতে পার।

তাহলে c ই হবে আউটপুট। অথবা এক লাইনে result = sum(sum(sum(n))); লিখলেও result variable এ আউটপুটটা পেয়ে যাবা। এখানে কিন্তু রিকার্সিভ ফাংশনের মত sum() function-টি নিজেই নিজেকে কল করেছে। রিকার্সিভ ফংশন সম্পর্কে প্রাথমিক ধারণা পাবে এখান থেকে

Comments

comments

Leave a Reply

Your email address will not be published. Required fields are marked *