ในปัญหานี้ เราได้รับจำนวนเต็มบวก N หน้าที่ของเราคือค้นหาความสุภาพของตัวเลข
จำนวนที่สุภาพ เป็นตัวเลขที่สามารถแสดงเป็นผลรวมของตัวเลขตั้งแต่สองตัวขึ้นไปติดต่อกันได้
ความสุภาพของตัวเลข ถูกกำหนดเป็นจำนวนวิธีที่แสดงตัวเลขเป็นผลรวมของจำนวนเต็มต่อเนื่องกัน
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
n = 5
ผลลัพธ์
1
คำอธิบาย
2 + 3 = 5, is the only consecutive sum.
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาง่ายๆ คือ การตรวจสอบตัวเลขต่อเนื่องกันทั้งหมดจนถึง N และหากผลรวมเท่ากับ N ให้เพิ่มจำนวนซึ่งเป็นความสุภาพของตัวเลข
โซลูชันนี้ไม่ได้มีประสิทธิภาพ แต่โซลูชันที่ซับซ้อนแต่มีประสิทธิภาพคือการใช้การแยกตัวประกอบ โดยใช้สูตรความสุภาพที่เกิดขึ้นเป็นผลคูณของปัจจัยคี่ เช่น
If the number is represented as N = ax * by * cz… 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