เราได้รับตัวเลข N เป็นอินพุต เป้าหมายคือการนับจำนวนหลักทั้งหมดระหว่างตัวเลข 1 ถึง N 1 ถึง 9 ต้องใช้ตัวละ 1 หลัก 11 ถึง 99 ต้องใช้ตัวละ 2 หลัก 100 ถึง 999 ต้องใช้ 3 หลักต่อไปเรื่อยๆ
ให้เราเข้าใจด้วยตัวอย่าง
ป้อนข้อมูล − N=11
ผลผลิต − นับจำนวนหลักทั้งหมดตั้งแต่ 1 ถึง N คือ 13
คำอธิบาย − ตัวเลข 1 ถึง 9 มีตัวละ 1 หลัก :9 หลัก 10, 11 มีตัวละ 2 หลัก 4 หลัก. ตัวเลขทั้งหมด=9+4=13.
ป้อนข้อมูล − N=999
ผลผลิต − นับจำนวนหลักทั้งหมดตั้งแต่ 1 ถึง N คือ 2889
คำอธิบาย − ตัวเลข 1 ถึง 9 มีตัวละ 1 หลัก :9 หลัก 10 ถึง 99 มีตัวละ 2 หลัก :180 หลัก 100 ถึง 999 มี 3 หลัก :2700 หลัก รวมทั้งหมด =2700 + 180 + 9 =2889 หลัก
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
เราจะใช้สองวิธี วิธีแรกแบบไร้เดียงสาโดยใช้ฟังก์ชันแบบเรียกซ้ำเพื่อคำนวณตัวเลขในจำนวนตัวเลข แปลง num ที่ส่งผ่านเป็นสตริง ความยาวของสตริงเป็นตัวเลขใน num ทำเช่นนี้สำหรับแต่ละหมายเลขที่ข้าม num-1 ปัจจุบันแบบเรียกซ้ำ
-
นำตัวเลขมาเป็นจำนวนเต็มบวก
-
ฟังก์ชัน total_digits(int num) รับค่า num และคืนค่าหลักเป็นตัวเลขระหว่าง 1 ถึง num
-
ในการคำนวณตัวเลขใน num ให้แปลง num เป็นสตริง (to_string(num)).
-
ความยาวของสตริงมีตัวเลขเป็นตัวเลข
-
ถ้า num คือ 1 ให้คืนค่า 1 อย่างอื่น return length+ total_digits(num-1) สำหรับตัวเลขที่เหลือน้อยกว่า num
-
ในที่สุดเราจะได้ตัวเลขทั้งหมดเป็นผล
แนวทางที่มีประสิทธิภาพ
ในแนวทางนี้ เราจะใช้ตรรกะที่ว่าสำหรับแต่ละตัวเลขจนถึง N เราจะข้าม 10, 100, 1000 จนถึง N สำหรับแต่ละ 10i จำนวนหลักคือ (num-i + 1)
-
นำตัวเลขมาเป็นจำนวนเต็มบวก
-
ฟังก์ชัน total_digits(int num) รับค่า num และคืนค่าหลักเป็นตัวเลขระหว่าง 1 ถึง num
-
เริ่มนับรวมเป็น 0
-
ข้าม i=1 ถึง i<=num เพิ่ม i 10 ในการวนซ้ำแต่ละครั้ง และเพิ่ม num-i+1 เพื่อนับ
-
คืนค่าการนับที่ส่วนท้ายของลูปเป็นผลลัพธ์
ตัวอย่าง (แนวทางไร้เดียงสา)
#include <bits/stdc++.h> using namespace std; int total_digits(int num){ string str = to_string(num); int length = str.length(); if (num == 1){ return 1; } return length + total_digits(num - 1); } int main(){ int num = 20; cout<<"Count of total number of digits from 1 to n are: "<<total_digits(num); return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of total number of digits from 1 to n are: 31
ตัวอย่าง (แนวทางที่มีประสิทธิภาพ)
#include <bits/stdc++.h> using namespace std; int total_digits(int num){ int count = 0; for(int i = 1; i <= num; i *= 10){ count = count + (num - i + 1); } return count; } int main(){ int num = 20; cout<<"Count of total number of digits from 1 to n are: "<<total_digits(num); return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of total number of digits from 1 to n are: 31