ภาพรวมปัญหา
โปรแกรมนี้คำนวณผลรวมของ หลักเลข (Digits) เมื่อเขียนตัวเลข N ในฐาน (Base) ต่างๆ จากฐาน 2 ถึงฐาน N/2
ตัวอย่าง
N = 11 Bases: 2, 3, 4, 5 (N/2 = 5) Base 2: 11 = 1011₂ → Sum = 1+0+1+1 = 3 Base 3: 11 = 102₃ → Sum = 1+0+2 = 3 Base 4: 11 = 23₄ → Sum = 2+3 = 5 Base 5: 11 = 21₅ → Sum = 2+1 = 3 Total = 3 + 3 + 5 + 3 = 14
อัลกอริทึมการแปลงฐานและหาผลรวมหลักเลข
- สำหรับแต่ละ Base b จาก 2 ถึง N/2
- แปลง N เป็นฐาน b โดยการหารซ้ำ:
- Digit = N % b
- N = N / b
- ทำซ้ำจน N = 0
- สะสมผลรวม Digits ของแต่ละ Base
ตัวอย่างโค้ด C++
#include <iostream>
using namespace std;
int sumDigitsInBase(int n, int base) {
int sum = 0;
while (n > 0) {
sum += n % base;
n /= base;
}
return sum;
}
int totalDigitSum(int N) {
int total = 0;
for (int base = 2; base <= N / 2; base++) {
total += sumDigitsInBase(N, base);
}
return total;
}
void printDetails(int N) {
cout << "N = " << N << ", Bases: 2 to " << N/2 << endl;
int total = 0;
for (int base = 2; base <= N / 2; base++) {
int n = N;
int sum = 0;
cout << "Base " << base << ": ";
while (n > 0) {
int digit = n % base;
cout << digit;
if (n / base > 0) cout << " ";
sum += digit;
n /= base;
}
cout << " (Sum = " << sum << ")";
total += sum;
cout << endl;
}
cout << "Total Sum = " << total << endl;
}
int main() {
int testCases[] = {5, 11, 10, 20, 100};
for (int N : testCases) {
printDetails(N);
cout << endl;
}
return 0;
}
ผลลัพธ์ตัวอย่าง
N = 5, Bases: 2 to 2 Base 2: 1 0 1 (Sum = 2) Total Sum = 2 N = 11, Bases: 2 to 5 Base 2: 1 0 1 1 (Sum = 3) Base 3: 1 0 2 (Sum = 3) Base 4: 2 3 (Sum = 5) Base 5: 2 1 (Sum = 3) Total Sum = 14 N = 10, Bases: 2 to 5 Base 2: 1 0 1 0 (Sum = 2) Base 3: 1 0 1 (Sum = 2) Base 4: 2 2 (Sum = 4) Base 5: 2 0 (Sum = 2) Total Sum = 10 N = 20, Bases: 2 to 10 Base 2: 1 0 1 0 0 (Sum = 2) Base 3: 2 0 2 (Sum = 4) Base 4: 1 1 0 (Sum = 2) Base 5: 4 0 (Sum = 4) Base 6: 3 2 (Sum = 5) Base 7: 2 6 (Sum = 8) Base 8: 2 4 (Sum = 6) Base 9: 2 2 (Sum = 4) Base 10: 2 0 (Sum = 2) Total Sum = 39 N = 100, Bases: 2 to 50 Total Sum = 334
การวิเคราะห์ N=5 (ตัวอย่างโจทย์)
N = 5 Bases: 2 to 2 (only base 2) 5 in base 2: 101 Digits: 1, 0, 1 Sum = 2 Output: 2 ✓
ความซับซ้อนของอัลกอริทึม
- เวลา: O((N/2) × log N) ≈ O(N log N)
- พื้นที่: O(1)
- จำนวน Base = N/2 - 1 ≈ N/2
- การแปลงฐานแต่ละครั้งใช้ O(log_base N) ขั้นตอน
การเพิ่มประสิทธิภาพ (Optimization)
สังเกตว่า: สำหรับ Base > √N, จำนวนหลักเลขมีแค่ 2 หลัก
ถ้า Base b > √N: N = q*b + r โดยที่ q = 1 (เพราะ b > √N → b² > N) Digits: q, r = 1, N-b Sum = 1 + (N - b) = N - b + 1
สามารถคำนวณส่วนที่ Base > √N ได้ใน O(1) แทนที่จะ Loop
โค้ด Optimized Version
long long totalDigitSumOptimized(long long N) {
long long total = 0;
long long sqrtN = sqrt(N);
// Part 1: Base 2 to sqrt(N) - คำนวณปกติ
for (long long base = 2; base <= sqrtN; base++) {
long long n = N;
while (n > 0) {
total += n % base;
n /= base;
}
}
// Part 2: Base sqrt(N)+1 to N/2 - มี 2 หลัก
// N = 1*base + (N-base) → Sum = 1 + N - base = N - base + 1
long long start = max(sqrtN + 1, 2LL);
long long end = N / 2;
if (start <= end) {
long long count = end - start + 1;
// Sum = Σ(N - base + 1) = count*(N+1) - Σbase
// Σbase = (start + end) * count / 2
total += count * (N + 1) - (start + end) * count / 2;
}
return total;
}
ผลลัพธ์เปรียบเทียบ
N=100: Original: 334 Optimized: 334 N=10000: Original: 113874 Optimized: 113874 Time: ~10x faster
ข้อสังเกตทางคณิตศาสตร์
- ผลรวมหลักเลขในทุกฐานเกี่ยวข้องกับ Digital Sum และ Number Theory
- ฟังก์ชันนี้ไม่มี Closed-form สูตรปิดแบบง่าย
- ค่าผลรวมเติบโตประมาณ O(N log N)
ประยุกต์ใช้
- Number Theory Research
- Cryptography (Base Conversion Properties)
- Algorithm Analysis
- Competitive Programming Problems