用 C++ 统计从 N 开始,每次加 1 并去除尾部零后能生成的唯一数字个数


给定一个数字 N 作为输入。对 N 执行两个操作,并确定在此过程中生成的唯一数字的个数。步骤如下:

  • 将数字加 1

  • 如有,则去除生成的数字的尾部零

如果 N 为 8,则生成的数字将为

应用步骤 1:8 → 9 →

应用步骤 2:1 → (从 10 中去除 0)

应用步骤 1:2 → 3 → 4 → 5 → 6 → 7 → 8 (相同的序列)

唯一数字的个数为 9。

例如

输入

N=21

输出

Count of unique numbers that can be generated from N by adding one and
removing trailing zeros are: 18

解释

Numbers will be: 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3 −−−now same sequence Unique numbers are: 18

输入

N=38

输出

Count of unique numbers that can be generated from N by adding one and removing trailing zeros are: 11

解释

Numbers will be:
38, 39, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4 −−−now same sequence
Unique numbers are: 11

**以下程序中使用的方案如下:**

在此方案中,我们将创建一个无序集合,其中包含应用步骤 1 和 2 后生成的全部唯一数字。如果数字重复,我们将停止迭代。集合的大小将给出在此过程中生成的唯一数字的个数。

  • 将数字 N 作为整数。

  • 使用 unordered_set<int> U_S 插入生成的数字。

  • 函数 unique_N(unordered_set<int>& U_S, int N) 获取集合和 N,并将数字添加到集合 U_S 中,直到集合中的所有数字都是唯一的。

  • 如果 U_S.count(N) 返回 1,则表示 N 已存在于集合中。因此,数字将重复,从函数返回。

  • 否则,将 N 插入到集合中并应用操作 1(加 1)。

  • 检查数字 N 是否有尾部零(是否是 10 的倍数)。

  • 如果 N % 10 为 0,则通过将其除以 10 来去除尾部零。

  • 使用更新后的 N 调用函数 unique_N()。

  • 从函数返回后,将计数作为集合 U_S 的大小。

  • 将结果打印为计数。

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
void unique_N(unordered_set<int>& U_S, int N){
   if (U_S.count(N)){
      return;
   }
   U_S.insert(N);
   N = N + 1;
   while (N % 10 == 0){
      N = N / 10;
   }
   unique_N(U_S, N);
}
int main(){
   int N = 7;
   unordered_set<int> U_S;
   unique_N(U_S, N);
   int count = U_S.size();
   cout<<"Count of unique numbers that can be generated from N by adding one and removing
      trailing zeros are: "<<count;
   return 0;
}

输出

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

Count of unique numbers that can be generated from N by adding one and removing trailing zeros are: 9

更新于:2021年1月5日

浏览量 134 次

开启你的职业生涯

完成课程获得认证

开始学习
广告