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;
}
খুবই সুন্দর একটা প্রোবলেম , আমার নিজেরও খুব পছন্দ হয়েছে , প্রোবলেম টি ।।
তোমায় , দুইটি সংখ্যার গুণফল দেয়া আছে , তোমায় বলতে হবে সেই দুটি সংখ্যার মাঝে মিনিমাম ডিফারেন্স কতো ????????
ধরো , দেয়া আছে - ২০ । তাহলে , এমন দুইটা সংখ্যা কি হতে পারে ? যাদের গুণ করলে গুণফল ২০ হবে , আবার তাদের মাঝের ডিফারেন্সও অনেক ক্ষুদ্র হবে , অন্যদের তুলনায় ।। চলো চেক করি -
১০ কে ২ দিয়ে গুণ করলেও ২০ হয় কিন্তু , এদের মাঝের ডিফারেন্স ৮ ।।
২০ কে ১ দিয়ে গুণ করলেও ২০ হয় কিন্তু , এদের মাঝের ডিফারেন্স ১৯ ।।
৪ কে ৫ দিয়ে গুণ করলেও ২০ হয় কিন্তু , এদের মাঝের ডিয়াফ্রেন্স ১ ।
এর মানে , আমার কাংক্ষিত দুইটি সংখ্যা ৪& ৫ , আমায় প্রিন্ট করতে হবে , এদের ডিফারেন্স ।।
আচ্ছা , নিজে আগে চিন্তা করো , কিভাবে করা যেতে পারে ??? আমরা যখন ডিভিসর বের করি , তখন কি করি ??? দেয়া সংখ্যাটির বর্গ মূল অবদি চেক করি , তাই তো ??? আমরা এখানেও তাই করবো ।। তারপর , সবশেষ যে ডিভিসর বের হবে ,সেটা দিয়ে সংখ্যাটিকে ভাগ করলে , আমি জোড়া'র অপর সংখ্যাটি পেয়ে যাবো , তাই না ??? আমরা এখানে , সংখ্যাটির বর্গমূল অবদি চেক করার সময় , সবশেষ যেই ডিভিসর পাবো , সেটাই আমাদের নিতে হবে , কারণ এই ডিভিসর আর এর আরেক পার্ট এর মধ্যেই মিনিমাম ডিফারেন্স থাকবে ।।
১ ২ ৪ ৫ ১০ ২০
১ ও ২০ = ১৯
২ ও ১০ =৮
৪ ও ৫ = ১
ধরে নিলাম , 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