计算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。其他长度小于num的其他返回长度+ total_digits(num-1)。

  • 最后,我们将得到总位数。

高效方法

在这种方法中,我们将使用以下逻辑,即每个数字最多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