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

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

Post updated on 1st October, 2017 at 06:53 pm

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

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 থেকে এই ফাংশনকে ৩ বার কল দিব। তাহলেই কাজ হয়ে যাবে।

int sum(int n){

    int digit,res=0;

    while(n!=0)
    {
        digit = n % 10; //digit আলাদা করা হচ্ছে
        res = res + digit; // আলাদা করা ডিজিট res এর সাথে যোগ হচ্ছে
        n = n / 10; //যেই ডিজিটটা যোগ হল সেই ডিজিটকে n থেকে বাদ দেয়া হচ্ছে
    }

    return res;

}

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

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

{
   [...]

    a = sum(n);
    b = sum(a);
    c = sum(b);

   [...]
}

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

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

  1. ভাই কোন সংখ্যার জন্য কি তিন বারের বেশি ফাংশন ঘুরতে পারে না?

  2. এই কোডটি রান টাইম ইরর আসার কারণ কী?

    #include
    int main()
    {
            int n,s,i;
            while(1)
            {
                    scanf("%d", &n);
                    if(n==0) 
                          break;
                    for(i=0;i<3;i++)
                    {
                           s=0;
                           while(n!=0){
                                   s=s+n%10;
                                   n=n/10;
                           }
                           n=s;
                    }
                    printf("%d\n", n);
            }
    }
    
    1. দ্রুত রেসপন্স পাওয়ার জন্য এই গ্রুপে আপনার সমস্যাটি জানিয়ে পোস্ট করতে পারেন। কোড শেয়ার করার জন্য অবশ্যই ideone.com বা pastebin.com এরকম কোনো সাইটের মাধ্যমে কোড শেয়ার করবেন। নইলে পোস্ট অ্যাপ্রুভ নাও হতে পারে।

Leave a Reply

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