এই সমস্যায়, আমরা একটি পূর্ণসংখ্যা 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