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

Repeated Unit Divisibility (ตัวเลขซ้ำ 1 หารลงตัว) ใน C++

ในบทความนี้ เราจะอภิบายการหาจำนวนหน่วยที่ซ้ำ (Repeated Units) ที่หารด้วย N ลงตัว Repeated units คือตัวเลขที่ประกอบด้วยเลข 1 เท่านั้น ให้ R(k) เป็น repeated unit ที่ k คือความยาวของเลข 1 เช่น R(4) = 1111 เราต้องหาค่า k น้อยที่สุดที่ทำให้ R(k) หารด้วย N ลงตัว เช่น:

Input : N = 13 
Output : k = 6 
Explanation : R(6) คือ 111111 หาร 13 ลงตัว

Input : N = 31 
Output : k = 15

แนวทางแก้ปัญหา

คุณอาจคิดว่าจะลองทุก k ตั้งแต่ 1 จนกว่า R(k) จะหาร N ลงตัว แต่จะไม่รู้ว่า N หาร R(k) ไม่ลงตัวสำหรับ k ใดๆ ทำให้ซับซ้อน

แนวทางที่มีประสิทธิภาพ:

  • ตรวจสอบว่า N เป็น coprime กับ 10 หรือไม่ (คือ N ไม่หาร 2 และ 5 ลงตัว)
  • ถ้า ไม่ใช่ coprime → R(k) จะไม่เคยหาร N ลงตัวสำหรับ k ใดๆ
  • ถ้า ใช่ coprime → สำหรับ R(1), R(2), R(3)... คำนวณเศษของ R(i) หาร N จะได้ n ค่าเศษ
  • หาเศษที่ซ้ำกันของ R(i) และ R(j) ทำให้ R(i) - R(j) หาร N ลงตัว
  • ความต่างของ R(i) และ R(j) จะเป็น repeated unit คูณกำลังของ 10 แต่ 10 และ N เป็น coprime ดังนั้น R(k) จะหาร N ลงตัว

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N = 31;
    int k = 1;
    
    // ตรวจสอบว่า N เป็น coprime กับ 10
    if (N % 2 == 0 || N % 5 == 0) {
        k = 0;
    } else {
        int r = 1;
        int power = 1;
        // ตรวจสอบจนกว่าเศษจะหาร N ลงตัว
        while (r % N != 0) {
            k++;
            power = (power * 10) % N;
            r = (r + power) % N;
        }
    }
    
    cout << "Value for k : " << k;
    return 0;
}

ผลลัพธ์

Value for k : 15

สรุป

ในบทความนี้ เราอภิบายการหาค่า k สำหรับ R(k) โดยที่ R(k) คือ repeated units ที่หาร N ลงตัว เราอภิบายวิธีที่มีประสิทธิภาพพร้อมโค้ด C++ สามารถเขียนในภาษาอื่นได้เช่น Java, C, Python หวังว่าจะเป็นประโยชน์