পারফেক্ট নাম্বার কী?
পারফেক্ট নাম্বার হলো একটি ধনাত্মক পূর্ণসংখ্যা যা নিজের বাদে বাকি সব ভাজকের সমষ্টির সমান। অর্থাৎ, একটি সংখ্যা n যদি তার সব প্রপার ডিভাইজারর (proper divisors) সমষ্টি n-র সমান হয়, তবে সেটিকে পারফেক্ট নাম্বার বলা হয়।
উদাহরণ: ৬ হলো প্রথম পারফেক্ট নাম্বার। এর ভাজকগুলো: ১, ২, ৩। সমষ্টি = ১+২+৩ = ৬।
অন্যান্য পারফেক্ট নাম্বার: ২৮, ৪৯৬, ৮১২৮, ৩৩৫৫০৩৩৬
ইনপুট ও আউটপুট উদাহরণ
ইনপুট:
Enter the number : 496
আউটপুট:
The number 496 is a perfect number
অ্যালগরিদম
- প্রোগ্রাম শুরু করুন
- দুটি লং এবং একটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_input, my_sum, i
- ব্যবহারকারী থেকে সংখ্যা ইনপুট নিন
- my_sum = 0 এবং i = 1로 ইনিশিয়ালাইজ করুন
- হواইল লুপ চালান যতক্ষণ i <= my_input/2
- যদি my_input % i == 0 হয়, তবে my_sum += i করুন
- i বাড়ান (i++)
- লুপ শেষে যদি my_sum == my_input হয়, তবে পারফেক্ট নাম্বার
- ফলাফল প্রদর্শন করুন
- প্রোগ্রাম শেষ করুন
উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া
import java.util.Scanner;
public class PerfectNumber {
public static void main(String args[]) {
long my_input, my_sum;
int i;
my_sum = 0;
System.out.println("Required packages have been imported");
Scanner my_scanner = new Scanner(System.in);
System.out.println("A reader object has been defined");
System.out.print("Enter the number : ");
my_input = my_scanner.nextLong();
i = 1;
while (i <= my_input / 2) {
if (my_input % i == 0) {
my_sum = my_sum + i;
}
i++;
}
if (my_sum == my_input)
System.out.println("The number " + my_input + " is a perfect number");
else
System.out.println("The number " + my_input + " is not a perfect number");
}
}
উদাহরণ ২: পূর্বনির্ধারিত মান ব্যবহার
import java.util.Scanner;
public class PerfectNumber {
public static void main(String args[]) {
long my_input, my_sum;
int i;
my_sum = 0;
my_input = 496;
System.out.println("The number is defined as " + my_input);
i = 1;
while (i <= my_input / 2) {
if (my_input % i == 0) {
my_sum = my_sum + i;
}
i++;
}
if (my_sum == my_input)
System.out.println("The number " + my_input + " is a perfect number");
else
System.out.println("The number " + my_input + " is not a perfect number");
}
}
কোড ব্যাখ্যা
- লং টাইপ: বড় সংখ্যা হ্যান্ডেল করার জন্য long ব্যবহার করা হয়েছে
- লুপ সীমা: i <= my_input/2 কারণ কোনো সংখ্যার ভাজক তার অর্ধেকের চেয়ে বড় হতে পারে না (নিজের বাদে)
- মডুলাস অপারেটর: my_input % i == 0 মানে i হলো my_input-এর ভাজক
- সময় জটিলতা: O(n) - লিনিয়ার টাইম কমপ্লেক্সিটি
অপ্টিমাইজেশন টিপস
বড় সংখ্যার জন্য লুপকে sqrt(n) পর্যন্ত চালানো যায় এবং জোড়া ভাজক যোগ করে দক্ষতা বেড়ানো যায়:
for (long i = 1; i * i <= my_input; i++) {
if (my_input % i == 0) {
my_sum += i;
if (i != my_input / i && i != 1) {
my_sum += my_input / i;
}
}
}
প্রসangsa জ্ঞান
ইউক্লিড প্রমাণ করেছেন যে, যদি 2^p - 1 একটি মেরসেন প্রাইম (Mersenne prime) হয়, তবে 2^(p-1) * (2^p - 1) একটি পারফেক্ট নাম্বার হবে। এখন পর্যন্ত ৫১টি মেরসেন প্রাইম খুঁজে পাওয়া গেছে, তাই ৫১টি পারফেক্ট নাম্বার জানা আছে।