Strong Number** คือ ตัวเลขที่ผลรวมของแฟกทอเรียลแต่ละหลัก เท่ากับตัวเลขนั้นเอง
ตัวอย่าง
- 145: 1! + 4! + 5! = 1 + 24 + 120 = 145 ✓ Strong
- 123: 1! + 2! + 3! = 1 + 2 + 6 = 9 ≠ 123 ✗ Not Strong
- 40585: 4! + 0! + 5! + 8! + 5! = 24 + 1 + 120 + 40320 + 120 = 40585 ✓ Strong
อัลกอริทึม
- เก็บตัวเลขต้นฉบับไว้ (temp)
- วนลูปดึงหลักสุดท้าย (n % 10)
- คำนวณแฟกทอเรียลของหลักนั้น
- บวกสะสม (sum += fact)
- ตัดหลักสุดท้าย (n /= 10)
- ทำจน n = 0
- เปรียบเทียบ sum กับ temp
โค้ดคำนวณแฟกทอเรียล (Optimization)
แทนที่จะคำนวณแฟกทอเรียลซ้ำ ให้ Pre-compute 0! ถึง 9! ไว้:
int fact[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
ตัวอย่างโปรแกรม (Basic)
#include <stdio.h>
int main() {
int n, temp, rem, sum = 0, fact;
printf("Enter a number: ");
scanf("%d", &n);
temp = n;
while(n > 0) {
rem = n % 10;
// คำนวณแฟกทอเรียล
fact = 1;
for(int i = 1; i <= rem; i++)
fact *= i;
sum += fact;
n /= 10;
}
if(sum == temp)
printf("%d is a Strong Number\n", temp);
else
printf("%d is NOT a Strong Number\n", temp);
return 0;
}
ตัวอย่างโปรแกรม (Optimized - Lookup Table)
#include <stdio.h>
int main() {
int n, temp, rem, sum = 0;
int fact[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
printf("Enter a number: ");
scanf("%d", &n);
temp = n;
while(n > 0) {
rem = n % 10;
sum += fact[rem]; // O(1) Lookup
n /= 10;
}
if(sum == temp)
printf("%d is a Strong Number\n", temp);
else
printf("%d is NOT a Strong Number\n", temp);
return 0;
}
ผลลัพธ์
Run 1: Enter a number: 145 145 is a Strong Number Run 2: Enter a number: 25 25 is NOT a Strong Number Run 3: Enter a number: 40585 40585 is a Strong Number
Strong Numbers ที่รู้จัก (Base 10)
มีเพียง 4 ตัวเท่านั้น: 1, 2, 145, 40585
ความซับซ้อน
- Time: O(d) โดย d = จำนวนหลัก (ใช้ Lookup Table)
- Space: O(1)