Saturday, October 14, 2017

DCP-162: Love And Fight Problem Solution & Logic

https://www.devskill.com/CodingProblems/ViewProblem/162

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

ধরো , দেয়া আছে - ২০ । তাহলে , এমন দুইটা সংখ্যা কি হতে পারে ? যাদের গুণ করলে গুণফল ২০ হবে , আবার তাদের মাঝের ডিফারেন্সও অনেক ক্ষুদ্র হবে , অন্যদের তুলনায় ।। চলো চেক করি -

১০ কে ২ দিয়ে গুণ করলেও ২০ হয় কিন্তু , এদের মাঝের ডিফারেন্স ৮ ।।
২০ কে ১ দিয়ে গুণ করলেও ২০ হয় কিন্তু , এদের মাঝের ডিফারেন্স ১৯ ।।
৪ কে ৫ দিয়ে গুণ করলেও  ২০ হয় কিন্তু , এদের মাঝের ডিয়াফ্রেন্স ১ ।

এর মানে , আমার কাংক্ষিত দুইটি সংখ্যা ৪& ৫ , আমায় প্রিন্ট করতে হবে , এদের ডিফারেন্স ।।
আচ্ছা , নিজে আগে চিন্তা করো , কিভাবে করা যেতে পারে ??? আমরা যখন ডিভিসর বের করি , তখন কি করি ??? দেয়া সংখ্যাটির বর্গ মূল অবদি চেক করি , তাই তো ??? আমরা এখানেও তাই করবো ।। তারপর , সবশেষ যে ডিভিসর বের হবে ,সেটা দিয়ে সংখ্যাটিকে ভাগ করলে , আমি জোড়া'র অপর সংখ্যাটি পেয়ে যাবো , তাই না ??? আমরা এখানে , সংখ্যাটির বর্গমূল অবদি চেক করার সময় , সবশেষ যেই ডিভিসর পাবো , সেটাই আমাদের নিতে হবে , কারণ এই ডিভিসর আর এর আরেক পার্ট এর মধ্যেই মিনিমাম ডিফারেন্স থাকবে ।।

                                       ১       ২        ৪               ৫          ১০        ২০

১  ও ২০ = ১৯
২ ও ১০ =৮
৪ ও ৫ = ১

ধরে নিলাম , N=20 |

 কি বুঝলে ????? আমরা যতোই , বাম পাশ থেকে  i  এর মান বাড়াবো , এইদিকে (N/i) এর মান ততো কমতে থাকে , একদম দেয়া সংখ্যাটির বর্গ মূল কাছে এসে যখন লুপ ভেংগে যাবে , ঠিক তখনই তাদের মাঝের ডিফারেন্স সবচেয়ে কম থাকে , এর চেয়ে কম কোনো জোড়া আর নেই ।। আশা করি , বুঝতে পেরেছো , না বুঝলে নিজে নিজে একটু চিন্তা করো -----------------------


কোড দেখি , চলো -----------------

// Nayeem Shahriar Joy ,Applied Physics & Electronic Engineering, University of Rajshahi.

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int t;
    long long int N,A,B;
    long int i;
    scanf("%d",&t);
    while(t--)
    {
        cin>>N;
        for(i=1;i<=sqrt(N)+1;i++)
        {
            if(N%i==0)
            {
                A=i;
            }
        }
        B=(N/A);
        cout<<abs(B-A)<<endl;
    }
    return 0;
}





No comments:

Post a Comment