Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

หาความสุภาพของตัวเลข (Politeness of a Number) ใน C++

ในปัญหานี้ เราได้รับจำนวนเต็มบวก N งานของเราคือหาความสุภาพของตัวเลข

Polite Number คือตัวเลขที่สามารถแสดงเป็นผลรวมของตัวเลขต่อเนื่องสองตัวขึ้นไปได้

Politeness of a number ถูกนิยามว่าเป็นจำนวนวิธีที่ตัวเลขสามารถแสดงเป็นผลรวมของจำนวนเต็มต่อเนื่องได้

มาดูตัวอย่างเพื่อเข้าใจปัญหา

Input

n = 5

Output

1

อธิบาย

2 + 3 = 5 เป็นผลรวมต่อเนื่องเพียงวิธีเดียว

วิธีแก้ปัญหา

วิธีแก้ที่ง่ายคือตรวจสอบตัวเลขต่อเนื่องทั้งหมดจนถึง N และถ้าผลรวมเท่ากับ N ให้เพิ่มจำนวนนับซึ่งเป็น politeness ของตัวเลข

วิธีนี้ไม่มีประสิทธิภาพ แต่มีวิธีที่ซับซ้อนแต่มีประสิทธิภาพมากกว่าคือใช้การแยกตัวประกอบ (factorization) โดยใช้สูตรสำหรับ politeness ซึ่งเป็นผลคูณของจำนวนตัวประกอบคี่ คือ

ถ้าตัวเลขแทนได้เป็น N = a^x * b^y * c^z... 
Politeness = [(x + 1)*(y + 1)*(z + 1)...] - 1

โปรแกรมแสดงการทำงานของวิธีแก้

ตัวอย่าง

#include <iostream> 
using namespace std; 

int calcPolitenessNumber(int n){ 
    int politeness = 1; 
    while (n % 2 == 0) 
        n /= 2; 
    for (int i = 3; i * i <= n; i += 2) { 
        int divCount = 0; 
        while (n % i == 0) { 
            n /= i; 
            ++divCount; 
        } 
        politeness *= divCount + 1; 
    } 
    if (n > 2) 
        politeness *= 2; 
    return (politeness - 1); 
} 

int main(){ 
    int n = 13; 
    cout<<"Politeness of "<<n<<" is "<<calcPolitenessNumber(n); 
    return 0; 
}

ผลลัพธ์

Politeness of 13 is 1