当前位置: 首页 > 编程笔记 >

在C ++中找出小于n且包含多个相似数字的整数的程序

白志勇
2023-03-14
本文向大家介绍在C ++中找出小于n且包含多个相似数字的整数的程序,包括了在C ++中找出小于n且包含多个相似数字的整数的程序的使用技巧和注意事项,需要的朋友参考一下

假设我们有一个整数n,我们必须找到小于或等于n的正整数个数,其中整数个数至少有一个数字出现一次。

因此,如果输入为n = 200,则输出为38

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个数组

  • 对于初始化x:= n,当x为非零时,更新x:= x / 10,执行-

    • 在结尾处插入x mod 10

  • 反转数组

  • ret:= n

  • 对于初始化w:= 1,d:= 1,当w <a的大小时,更新(w增加1),-

    • d:= d * min(9,10-w + 1)

    • ret:= ret − d

  • 定义一个功能go()。这没有任何参数。

    • 对于初始化d:= i <1,当d <a [i]时,更新(将d增加1),执行-

    • 如果((1按位左移a [i])按位AND b)非零,则

    • 除此以外

    • ret:= ret − x

    • b:= b XOR(左移a [i] 1位)

    • 返回

    • b:=(1左移10)-1

    • 对于初始化i:= 0,当i <a的大小时,更新(将i增加1),执行-

    • (将retret减少1)

      list-paddingleft-2" style="list-style-type: square;">
  • 调用函数 go()

  • 返回ret

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
int solve(int n) {
   vector<int> a;
   for (int x = n; x; x /= 10) a.push_back(x % 10);
   reverse(a.begin(), a.end());
   int ret = n;
   for (int w = 1, d = 1; w < a.size(); ++w) {
      d *= min(9, 10 − w + 1);
      ret −= d;
   }
   auto go = [&]() {
      int b = (1 << 10) − 1;
      for (int i = 0; i < a.size(); ++i) {
         for (int d = (i < 1); d < a[i]; ++d) {
            int x = 0;
            if ((1 << d) & b) ++x;
               for (int j = i + 1; j < a.size(); ++j) x *= 10 − j;
               ret −= x;
            }
            if ((1 << a[i]) & b)
            b ^= (1 << a[i]);
            else
            return;
         }
         −−ret;
      };
      go();
      return ret;
}
int main(){
   cout << solve(200) << endl;
   return 0;
}

输入值

200
输出结果
38

 类似资料:
  • 问题内容: 改写: 在我的项目中,我有图像。每个图像有5个标签,范围为[1,10]。我用Elasticsearch上传了这些标签: 我将这些文件加载​​到类型为“ img”的索引“ my_project”中的elasticsearch中: 我上传的其他示例文件: 在我的应用程序中,向量要长得多,但是具有固定数量的唯一元素。我喜欢这些文件中的20M。 现在,我想找到给定向量的相似文档。向量具有更多公

  • 本文向大家介绍找出C ++中整数数组中位数的程序,包括了找出C ++中整数数组中位数的程序的使用技巧和注意事项,需要的朋友参考一下 假设我们必须实现一个名为MedianClass的类,其中包含以下方法- add(value) 这会为数据结构添加一个值。 median() 查找数据结构中当前存在的所有数字的中位数。 因此,如果我们加上5、3、8并找到中位数,则输出将为5.0,然后如果我们加上9并找到

  • 我试图学习分布式计算,并遇到了一个寻找大量数字的中位数的问题: 假设我们有一大组数字(假设元素数为 N*K),它们无法放入内存(大小为 N)。我们如何找到这些数据的中位数?假设在内存上执行的操作是独立的,即我们可以考虑有K台机器,每台机器最多可以处理N个元素。 我认为中位数可以用于这个目的。我们可以一次将N个数装入内存。我们在< code>O(logN)时间内找到该集合的中值,并保存它。 然后我们

  • 我试着写一个代码,它接受一个介于1和1_000_000之间的整数,并返回一个比相同数字的整数大的最小整数,如果它不存在,则打印0。 举个例子 输入:156 输出165 输入330 输出0 输入27711 输出71127 我的问题是,下面的代码没有为其他输入返回正确的输出。 例如,在输入4231中,输出应该是4312。 我很难找到为每个输入返回正确输出的最佳算法。 TNX提前 }

  • 问题内容: 今天才开始学习Java,似乎无法弄清楚。我正在学习Learnjavaonline.org上的教程,该教程教您一些知识,然后要求您编写代码来完成特定的事情,然后检查输出以查看其正确性。问题是,如果它不正确,则不会说出原因,也不会给出正确代码的示例。 它希望我使用所有原语输出一个字符串,说“ H3110 w0r1d 2.0 true” 我想出了这个 } 但它输出 我怎样才能使它不将所有整数

  • 本文向大家介绍在C ++中找到一个数字X,其数字之和等于N,包括了在C ++中找到一个数字X,其数字之和等于N的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将找到一个数字,其中一些(包括其数字)等于给定的数字N。 这个想法很简单,我们将检查给定数字的左右100个数字。N≤1000000000且总和不超过100不会被限制。 让我们看看解决问题的步骤。 初始化号码。 编写一个循环100次的