C++ 中计算包含数字 0 且最多有 d 位的正整数个数


给定一个数字 d,表示数字的位数。目标是找到包含数字 0 且最多有 d 位的正整数的个数。

我们首先找到至少包含一个 0 的 d 位数字的个数。假设 d=3。要创建一个至少包含一个 0 的三位数,可能的方式是 -

Here d1 can have 1 to 9 : 9 ways
d2 can have 0-9 : 10 ways
d3 can have 0-9 : 10 ways
Total numbers possible: 9 x 10 x 10 = 9 x 102
For d digits, count of numbers: 9 x 10d-1
For d digits, numbers without any 0 are : 9d
Total numbers having d digits with at least one 0 = 9 x 10d-1 - 9d = 9 x ( 10d-1 - 9d-1 )

让我们通过例子来理解

输入 - d=4

输出 - 包含数字 0 且最多有 'd' 位的正整数的个数为 - 2619

解释 - 至少包含一个 0 的 x 位数字 -

1 digit numbers : 0
2 digit numbers : 9
3 digit numbers : 171
4 digit numbers: 2439
Total= 9+171+2439 = 2619

输入 - d=1

输出 - 包含数字 0 且最多有 'd' 位的正整数的个数为 - 0

解释 - 从 1 到 9,没有数字包含 0。

下面程序中使用的方案如下

我们将使用两种方案。第一种是使用 for 循环的简单方案。从 1 位到 d 位遍历,并使用上面提到的公式计算数字。将返回值加到计数中。

  • 获取表示位数的整数 d。

  • 函数 total_count(int d)) 获取位数 d 并返回具有 d 位且至少包含一个 0 的数字的个数。

  • 计算此类数字,例如 temp=9*(pow(10,d-1) - pow(9,d-1));

  • 返回 temp。

  • 函数 maximum_d(int d) 获取最大位数 d 并返回最多 d 位且至少包含一个 0 的数字的个数。

  • 使用循环从 1 位数开始遍历,然后是 2 位数,依此类推,直到 d 位数。

  • 对于每个 d,计算数字,例如 total_count(i)。将其添加到计数中。

  • 最后我们将得到总计数。

  • 返回计数作为结果。

高效方案

在这种方案中,我们将通过观察上述计算形成的等比数列来计算计数。

Solution is 9 x (10d-1 - 9d-1)
= 9 x (10d - 1)- 9 x (9d-1)
= 9 x (10i - 1) - 9 x (9i - 1) ( 1<=i<=d )
= g.p 1 - g.p 2
= 9x(10d-1)/(10-1) - 9x(9d-1)/(9-1)
= (10d-1)- (9/8)*(9d-1)
  • 将 d 作为最大位数。

  • 函数 maximum_d(int d) 获取最大位数 d 并返回最多 d 位且至少包含一个 0 的数字的个数。

  • 使用上述公式计算 temp_1 为 9*((pow(10,d)-1)/9)。

  • 计算 temp_2 为 9*((pow(9,d)-1)/8)。

  • 设置 count = temp_1 - temp_2。

  • 返回计数作为结果。

示例(简单方案)

 实时演示

#include<bits/stdc++.h>
using namespace std;
int total_count(int d){
   int temp = 9*(pow(10,d-1) - pow(9,d-1));
   return temp;
}
int maximum_d(int d){
   int count = 0;
   for (int i=1; i<=d; i++){
      count = count + total_count(i);
   }
   return count;
}
int main(){
   int d = 5;
   cout<<"Count of positive integers with 0 as a digit and maximum 'd' digits are: "<<maximum_d(d) << endl;
   return 0;
}

输出

如果我们运行上述代码,它将生成以下输出 -

Count of positive integers with 0 as a digit and maximum 'd' digits are: 33570

示例(高效方案)

 实时演示

#include<bits/stdc++.h>
using namespace std;
int maximum_d(int d){
   int temp_1 = 9*((pow(10,d)-1)/9);
   int temp_2 = 9*((pow(9,d)-1)/8);
   int count = temp_1 - temp_2;
   return count;
}
int main(){
   int d = 4;
   cout<<"Count of positive integers with 0 as a digit and maximum 'd' digits are: "<<maximum_d(d) << endl;
   return 0;
}

输出

如果我们运行上述代码,它将生成以下输出 -

Count of positive integers with 0 as a digit and maximum 'd' digits are: 2619

更新于: 2020-12-01

80 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告