用 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

更新於: 2020-12-01

853 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告