এই সমস্যায়, আমরা একটি পূর্ণসংখ্যা n দেওয়া হয়. আমাদের কাজ হল n এর সমস্ত ভাজকের মধ্যে অঙ্কের বৃহত্তম যোগফল খুঁজে বের করা।
সমস্যা বর্ণনা: এখানে, আমরা n সংখ্যাটির ভাজক পাব যার অঙ্কের যোগফল সবচেয়ে বড়।
সমস্যাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক,
ইনপুট: 18
আউটপুট: ৯
ব্যাখ্যা:
18 এর সমস্ত ভাজক হল 1, 2, 3, 6, 9, 18।
সর্বাধিক অঙ্কের যোগফল হল 9৷
৷সমাধান পদ্ধতি
N সংখ্যাটির সমস্ত ভাজক খুঁজুন। তারপর প্রতিটি ভাজকের অঙ্কের যোগফল বের করুন এবং তারপরে সবচেয়ে বড় যোগফল দিয়ে মান ফেরত দিন।
আমাদের সমাধানের কাজ চিত্রিত করার জন্য প্রোগ্রাম,
উদাহরণ
#include <iostream> using namespace std; int calcDigitSum(int n) { int sum = 0; while (n != 0) { sum = sum + n % 10; n = n/10; } return sum; } int largestDigitSumdivisior(int n) { int maxSum = 0; for (int i = 1; i <= n; i++) if (n % i == 0) maxSum = max(maxSum, calcDigitSum(i)); return maxSum; } int main() { int n = 45; cout<<"The divisor with largest sum of digits is "<<largestDigitSumdivisior(n)<<endl; return 0; }
আউটপুট
The divisor with largest sum of digits is 9
ভাজক খুঁজে বের করতে এবং এটিকে আরও কার্যকর করার পদ্ধতি পরিবর্তন করে সমাধানটিকে আরও কার্যকর করা যেতে পারে৷
এই সমস্যায়, আমরা sqrt(n) পর্যন্ত পুনরাবৃত্তি করব এবং সমস্ত ভাজক এবং অন্যান্য ভাজক n/div ব্যবহার করে গণনা করব। এটি sqrt(n) এ ভাজক খুঁজতে সময় জটিলতা হ্রাস করে।
আমাদের সমাধানের কাজ চিত্রিত করার জন্য প্রোগ্রাম,
উদাহরণ
#include <iostream> using namespace std; int calcDigitSum(int n) { int sum = 0; while (n != 0) { sum = sum + n % 10; n = n / 10; } return sum; } int largestDigitSumdivisior(int n) { int maxSum = 0; for (int i = 1; i*i <= n; i++) { if (n % i == 0) { maxSum = max(maxSum, calcDigitSum(i)); maxSum = max(maxSum,calcDigitSum(n/i)); } } return maxSum; } int main() { int n = 32; cout<<"The divisor with largest sum of digits is "<<largestDigitSumdivisior(n)<<endl; return 0; }
আউটপুট
The divisor with largest sum of digits is 8