สมมติว่าเรามีตัวเลข 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