เราได้รับตัวเลข N และอีกตัวเลขหนึ่ง L เป้าหมายคือหาตัวเลขระหว่าง 1 ถึง N ที่มีผลต่างระหว่างตัวเลขเองและผลรวมหลักของมัน ไม่ต่ำกว่า L
ถ้า N=23, L=10 จำนวนตัวเลขแบบนี้จะเป็น 4
23-(2+3)=18, 22-(2+2)=18, 21-(2+1)=18, 20-(2+0)=18
ตัวเลขทั้งหมดข้างต้นตรงตามเงื่อนไข
แต่ 19-(1+9)=9 ซึ่งน้อยกว่า L คล้ายกัน 18,17….1
ตัวอย่าง
อินพุต - N=30 L=19
เอาต์พุต - จำนวนตัวเลขที่ผลต่างระหว่างตัวเลขและผลรวมหลักไม่ต่ำกว่า L คือ - 1
คำอธิบาย - มีแค่ 30 ที่ตรงตามเงื่อนไข 30-(3+0)=27 > 19
อินพุต - N=123330 L=5466
เอาต์พุต - จำนวนตัวเลขที่ผลต่างระหว่างตัวเลขและผลรวมหลักไม่ต่ำกว่า L คือ - 6841
แนวทางที่ใช้ในโปรแกรมด้านล่าง
ใช้ Binary Search เราจะหาตัวเลขแรกที่ตรงตามเงื่อนไข ถ้าตัวเลขนั้นคือ num แล้วเงื่อนไขจะเป็นจริงสำหรับ num+1 และต่อไป
ถ้าค่า mid ปัจจุบันตรงตามเงื่อนไข ตัวเลขทั้งหมดระหว่าง mid และ end ก็จะตรงตามเงื่อนไขเดียวกัน ดังนั้นเราสามารถบวก end-mid+1 เข้า count ได้โดยตรง
- รับ num และ L เป็นตัวแปร long
- ฟังก์ชัน Digit_sum(LL num) รับตัวเลข num คืนค่าผลรวมหลักของมัน
- ตั้งค่า sum เริ่มต้นเป็น total=0
- ใช้ลูป while บวกเศษ num%10 เข้า total และลด num ลง 10 ทำซ้ำจนกว่า num>0
- คืนค่า total เป็นผลรวมหลักของ num
- ฟังก์ชัน Less_than_L(LL num, LL L) รับตัวเลข num และตัวเลข L คืนค่าจำนวนตัวเลขที่ผลต่างระหว่างตัวเลขและผลรวมหลักไม่ต่ำกว่า L
- ตั้งค่า count เริ่มต้นเป็น 0
- นำ Binary Search ไปใช้ด้วยลูป while โดย start=1 และ end=num
- คำนวณตัวเลขกลางเป็น temp=(start+end)/2
- ถ้าผลต่างระหว่าง temp และผลรวมหลักของ temp ไม่ต่ำกว่า L แล้วตัวเลขทั้งหมดที่มากกว่า temp ก็จะตรงตามเงื่อนไขเดียวกัน
- จำนวนตัวเลขแบบนั้นรวม temp จะเป็น num-temp+1 บวกเข้า count และตั้ง end=temp-1
- มิฉะนั้น ตั้ง start=temp+1
- ที่สิ้นสุดของ binary search count จะมีตัวเลขที่มีผลต่างระหว่างพวกเขาและผลรวมหลักไม่ต่ำกว่า L
- คืนค่า count เป็นผลลัพธ์
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int Digit_sum(LL num){
LL total = 0;
while (num > 0){
total += num % 10;
num = num/10;
}
return total;
}
LL Less_than_L(LL num, LL L){
LL count = 0;
LL start = 1;
LL end = num;
while (start <= end){
LL temp = (end + start) / 2;
LL temp_2 = temp - Digit_sum(temp);
if (temp_2 >= L){
count = num - temp + 1;
end = temp - 1;
}
else{
start = temp + 1;
}
}
return count;
}
int main(){
LL num = 234516;
LL L = 235;
cout << "Count of Numbers such that difference between the number and sum of its digits not less than L are: " << Less_than_L(num, L);
return 0;
}
เอาต์พุต
Count of Numbers such that difference between the number and sum of its digits not less than L are: 234267