用 C++ 統計從 1 到 N 的數字中所有數字的總數
給定一個數字 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 中的位數。對每個數字都這樣做,通過當前 num-1 遞迴地傳遞。
將數字作為正整數。
函式 total_digits(int num) 獲取 num 並返回 1 到 num 之間數字的位數。
要計算 num 中的位數,請將 num 轉換為字串。(to_string(num))。
字串的長度就是 num 中的位數。
如果 num 為 1,則返回 1。否則,返回長度 + 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 新增到計數中。
在 for 迴圈結束時返回計數作為結果。
示例(樸素方案)
#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