สมมติว่าเรามีตัวเลข n เราต้องนับจำนวนรวมของหลัก 1 ที่ปรากฏในตัวเลขที่ไม่ติดลบทั้งหมดน้อยกว่าหรือเท่ากับ n ดังนั้นหากอินพุตคือ 15 ผลลัพธ์จะเป็น 8 เพราะตัวเลขที่มี 1 คือ [1,10,11,12,13,14,15] จึงมี 8 1 วินาที
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ยกเลิก :=0
-
สำหรับการเริ่มต้น i :=1 เมื่อ i <=n, i =i * 10 do −
-
a :=n / i, b :=n mod i, x :=a mod 10
-
ถ้า x เท่ากับ 1 แล้ว
-
ret =ret + (a / 10) * i + (b + 1)
-
-
มิฉะนั้นเมื่อ x เท่ากับ 0 แล้ว −
-
ret =ret + (a / 10) * i
-
-
มิฉะนั้น
-
ret =ret + (a / 10 + 1) * i
-
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int countDigitOne(int n) {
int ret = 0;
for(long long int i = 1; i <= n; i*= (long long int)10){
int a = n / i;
int b = n % i;
int x = a % 10;
if(x ==1){
ret += (a / 10) * i + (b + 1);
}
else if(x == 0){
ret += (a / 10) * i;
} else {
ret += (a / 10 + 1) *i;
}
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.countDigitOne(15));
} อินพุต
15
ผลลัพธ์
8