用 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 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告