求一个序列,其中任意n个数字相加不会等于该序列里的其他值,任意一个数字的倍数不等于该序列里的其他值

C#实现获取小于等于n的素数序列算法 具体思路是:先从小到大遍历所有数字,将素数的倍数标记为合数,最后剩下的未标记数字就是素数。在Main方法中,我们使用100作为参数调用了“GeneratePrimeNumbers”方法,并输出了小于等于100的素数序列。通过本篇文章的介绍和源代码的分析,相信读者已经掌握了使用C#编程语言获取小于等于n的素数序列的方法。接下来的循环中,从2开始遍历到n-1,如果当前数字p是素数,则将其倍数标记为合数(false)。最后,将所有素数添加到一个名为“primeNumbers”的List列表中,并返回这个列表。 阅读详情
/*
  求一个序列,要求:
    1.任意n个数字相加不会等于该序列里的其他值
    2.任意一个数字的倍数不等于该序列里的其他值
*/
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

string operator+(string const & s, int n)
{
  ostringstream oss;
  oss << s << n;
  return oss.str();
}

class ExSieve
{
  vector<int>   m_sieve;
  vector<int>   m_prime;

  void clear()
  {
    m_sieve[0] = 0; // 0不影响第1条的判定。0的倍数总是0,满足第2条。
    m_sieve[1] = 0; // 1乘后续的数都满足第2条,去掉。否则形不成序列
    for(int i = 2, n = m_sieve.size(); i < n; ++i){
      m_sieve[i] = 1;
    }
  }

#ifdef dbg
  void accum_sieve(int i, int sum, string sum_list)
#else
  void accum_sieve(int i, int sum)
#endif
  {
    int t = sum + m_prime[i];
    if(t < m_sieve.size() && m_sieve[t]){
      m_sieve[t] = 0;
#ifdef dbg
      cout << setw(10) << t << " = " << sum_list << ' ' << m_prime[i] << '\n';
#endif
    }

    if(++i < m_prime.size()){
#ifdef dbg
      accum_sieve(i, sum, sum_list);
      accum_sieve(i, t  , sum_list + " " + m_prime[i-1]);
#else
      accum_sieve(i, sum);
      accum_sieve(i, t  );
#endif
    }
  }

public:
  ExSieve()
    : m_sieve(2), m_prime()
  {
    this->clear();
  }

  void init(int n)
  {
    if(n < 2){
      n = 2;
    }
    m_sieve.resize(n);
    m_prime.clear();
    this->clear();
  }

  void sieve()
  {
    this->clear();

    for(int i = 2, nb = 0, CNT = m_sieve.size(); i < CNT; ++i){
      if(m_sieve[i]){
        for(int j = i + i; j < CNT; j += i){ // 倍数
          if(m_sieve[j]){
            m_sieve[j] = 0;
          }
        }

        if(!m_prime.empty()){
#ifdef dbg
          accum_sieve(0, i, string("") + i);
#else
          accum_sieve(0, i);
#endif
        }
        m_prime.push_back(i);
      }
    }
  }

  void print()
  {
    for(int i = 0, n = m_prime.size(); i < n; ++i){
      cout << m_prime[i] << ' ';
    }
    cout << '\n';
  }
};

int main()
{
  ExSieve es;
  es.init(10000000);
  es.sieve();
  es.print();
  return 0;
}

 

在我的电脑上过滤一千万以内的数,用了8.922s,还可以。

2 3 7 11 17 25 59 67 185 193 563 571 1697 1747 5141 5149 11995 25727 27439 78893 82345 240131 243583 723845 727297 2174987 2178439 6530119 6530123  

要求2用筛法,改进余地不大。

继续考虑条件1,但很明显,递归求子序列和重复了多次,冗余。

若f(1)到f(n)所有子序列的和记为集合S(n),那么S(n) 中的元素依次加上 f(n+1),构成集合SS(n),则S(n)与SS(n)的并集就是S(n+1),这样避免了反复递归计算。

由此得到算法2,改进明显:筛选1千万以内的数只需 0.219s。筛选1亿以内的数也只需2秒。

#include <cstring>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <list>
#include <vector>
using namespace std;

string operator+(string const & s, int n)
{
  ostringstream oss;
  oss << s << n;
  return oss.str();
}

class ExSieve2
{
  vector<char>   m_sums;
  vector<char>   m_sieve;
  vector<int>    m_sums_tmp;

  void init(int n)
  {
    if(n < 2){
      n = 2;
    }
    m_sums.resize(n);
    m_sieve.resize(n);

    memset(&m_sums[0], 0, n);
    memset(&m_sieve[0], 0, n);
    m_sums[1] = 1; // 任何数都是1的倍数,有1就形不成序列。必须去掉。
    m_sieve[0] = 1;
    m_sieve[1] = 1;
  }

public:
  ExSieve2()
    : m_sums(), m_sieve(), m_sums_tmp()
  {
  }

  void sieve(int const n)
  {
    this->init(n);

    for(int i = 2, max_sum = 0; i < n; ++i){
      if(m_sieve[i]){
        continue;
      }

      for(int j = 2, k = 0, J = min(max_sum, n-i); j < J; ++j){
        if(m_sums[j]){ // j是某个子序列的和、则(j + i)是子序列和。
          k = j + i;
          if(m_sums[k] == 0){
            m_sums_tmp.push_back(k);
            m_sieve[k] = 1;
          }
        }
      }
      for(vector<int>::const_iterator p = m_sums_tmp.begin(), e = m_sums_tmp.end(); p != e; ++p){
        m_sums[*p] = 1;
      }
      m_sums_tmp.resize(0);

      for(int j = 2, k = 0, J = min(i, n-i); j < J; ++j){
        if(m_sieve[j] == 0){ // j本身是序列中的元素,则(j + i)是子序列和。
          k = j + i;
          if(m_sums[k] == 0){
            m_sums [k] = 1;
            m_sieve[k] = 1;
          }
        }
      }
      max_sum += i;
      if(max_sum > 2 && max_sum < n){
        m_sums[max_sum] = 1;
        m_sieve[max_sum] = 1;
      }

      for(int j = i + i; j < n; j += i){ // 倍数
        if(m_sieve[j] == 0){
          m_sieve[j] = 1;
        }
      }
    }
  }

  void print()
  {
    for(int i = 0, n = m_sieve.size(); i < n; ++i){
      if(m_sieve[i] == 0){
        cout << i << ' ';
      }
    }
    cout << '\n';
  }
};

int main()
{
  ExSieve2 es;
  es.sieve(100000000);
  es.print();
  return 0;
}


 

橙光文字游戏制作工具 立即下载

相关推荐

labview循环求和

labview初学者练习迭代次数求和小实例,以及提示对话框的使用

如何表示数组所有数都不等于一个数_从有理数到实数和数的连续体

本文主要是想通过简单易懂且兼顾严谨性的方式来介绍如何从有理数过渡到实数。文章稍长,但看完后你至少会明白如下几个关键问题:无理数或实数的定义;实数集为什么是连续的、实数集里的数为什么可以和数轴上的点一一对应;无理数的独特性质;无理数为什么也满足有理数的运算法则和运算性质(如乘法结合律、分配律等);另外,本文引证了一些英文叙述,看不懂并无大碍,理解我的中文叙述才是重点。第一部分 从有理数集到连续的实数...

weixin_39646405的博客 622

ENVI与Sarscape协同处理哨兵一号数据的完整流程解析

本文详细解析了利用ENVI与Sarscape软件协同处理哨兵一号(Sentinel-1)SAR数据的完整工作流程。从环境搭建、数据导入与裁剪,到核心的DEM辅助多时相配准、斑点噪声滤波,再到最终的地理编码与辐射定标,提供了标准化的操作指南与实用技巧,帮助用户高效地将原始雷达数据转化为可用于分析的地理编码产品。

weixin_29251131的博客 339

正数数组的最小不可组成和

题目 给定一个正整数数组arr,其中所有的值都为整数,以下是最小不接组成和的概念 把arr每个子集的所有元素加起来出现很多值,其中最小的记为min,最大的记为max 在区间[min,max]上,如果有数不可以被arr某个子集相加得到,那么其中最小的那个数就是最小不可组成和。 如果[min,max]所有的数都可以相加得到,那么max+1就是arr的最小不可组成和 举例 arr=[1,2,...

独行的博客 663

关于自制的《航空学报》latex模板(非官网模板)

《航空学报》的官网只提供了word模板,并且该期刊投稿只需要pdf版本不需要源文件。为方便latex爱好者撰写论文,提供该模板及说明给广大科研人士~

qq_37105055的博客 4691

Seurat 单细胞转录组测序数据分析教程(三)——python(scanpy)

文章参考至,做了一个更详细的解读。本教程探讨了 scanpy 的可视化可能性,分为三个部分:嵌入的散点图(例如 UMAP、t-SNE)使用已知标记基因鉴定簇差异表达基因的可视化在本教程中,我们将使用来自 10x 的数据集,其中包含来自PBMC的 68k 个细胞。Scanpy 在其分布中包括该数据集的简化样本,该数据集仅包含 700 个细胞和 765 个高度可变的基因。该数据集已经过预处理和 UMAP 计算。在本教程中,我们还将使用以下文献标记:B细胞:CD79A、MS4A1。

coffeeii的博客 5827

(双指针)15. 三数之和

题目描述 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1: 输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 示例 2: 输入:nums = [] 输出:[] 示例 3: 输入:nums = [0] 输出:[] 提示: 0 <= nums.length <= 3000

учёба 3423

AI影像组学在结直肠癌诊疗中的应用:从特征提取到临床决策

影像组学通过高通量计算从医学影像中提取定量特征,揭示肿瘤内部的微观生物学行为,这些特征反映了纹理异质性、形状不规则度等影像表型。其核心原理在于将图像数据转化为可分析的数字特征,结合机器学习算法进行模式识别,从而实现对疾病状态的精准预测。这一技术的价值在于能够无创、定量地评估肿瘤特性,为精准医疗提供关键支持。在临床实践中,AI驱动的影像组学模型广泛应用于结直肠癌的诊疗全链条,包括肿瘤良恶性鉴别、基因突变预测、治疗反应评估和预后分析等场景。通过整合影像组学特征与临床数据,可以构建预测模型,辅助医生进行更准确的诊

weixin_28295799的博客 409

数论基础原理总结

UPD:2018.4.25 更新了快速求原根的啰嗦的证明 一、整除的性质 1,如果a|b,且b|c,则a|c 2,a|b且b|c,那么a|c 3,设m!=0,那么a|b等价于(m*a)|(m*b) 4,设整数x和y满足下式,a*x+b*y=1,且a|n,b|n,那么(a*b)|n 根据性质3可得,(a*b)|(n*b),(a*b)|(n*a), 根据性质4可得,(a*b)|x*(n*...

weixin_30644369的博客 4343

sklearn2pmml xgboost缺失值(missing)处理的坑

sklearn2pmml xgboost缺失值(missing)如何处理 今天同事在部署xgboost pmml模型时遇到了大坑,线上spark预测和本地python预测结果怎么都不对应,记录一下处理过程。 看了下同事的代码,貌似也没有问题 from sklearn2pmml import PMMLPipeline from sklearn2pmml import sklearn2pmml fro...

Skycrab 8969

OpenClaw进阶实战(二十五):抖音企业号——私信回复与视频评论分析

本文介绍了抖音企业号自动化运营的技术方案,重点解决私信互动效率低和风控严格两大挑战。文章分析了抖音集成的三大技术壁垒(视频复杂性、风控体系、封闭API)并对比了三种技术路径的优缺点。针对不同规模的运营主体,推荐官方API+RPA混合架构或真机RPA+AI辅助的方案。 详细讲解了环境准备步骤,包括抖音Skill安装、Cookie获取和配置文件设置。核心实现部分展示了私信自动回复功能的安全合规实现,包含意图分类、优先级排序、延迟发送等防封禁机制,并提供了完整的Python代码示例。该方案通过模拟人工操作、限制日

PeterPan的博客 159

Java 集合、数组 任意个数数字相加等于一个指定的数

一组数字 任意个数数字相加的和等于指定的数字。 比如数字集合 1,2,3, 4,5,6 ,列出所有数字相加等于6的可能性,那么结果有:1+2+3,2+4, 主要这里的结果不是数组打乱顺序相加,而是按照数组顺序取任意个数相加减,所有大家看到结果只有1+2+3而没有1+3+2或则3+2+1 step1、实体类: static class TestDTO { String i...

u014676171的博客 1万+

简要介绍 | 雷达穿墙成像及其应用场景

本文简要介绍了雷达穿墙成像技术的原理、研究现状、挑战与未来展望,希望能为相关领域的研究与应用提供参考。具有广泛的应用前景。本文将详细介绍雷达穿墙成像的原理,以及其在不同应用场景中的实践。逆时偏移算法(Reverse-Time Migration, RTM)雷达穿墙成像技术是一种先进的遥感技术,具有。的能力,可用于探测室内目标。安全与救援、建筑结构检测等领域。雷达穿墙成像技术的核心原理是。是Green函数,表示从接收点。雷达穿墙成像及其应用场景。雷达穿墙成像及其应用场景。目标识别与定位准确性。

NLOS的博客 2232

进阶52 N的倍数

52 N的倍数 作者: 张志寿 时间限制: 2S章节: 函数 问题描述 : 明明的爸爸在研究一个复杂的数学问题,研究了很长时间都没有结果。明明看见后就问爸爸在研究什么。明明的爸爸回答说:“我在研究一个整数的倍数问题,想找到某个数的倍数……”明明还没有等他爸爸说完,就抢着说:“这不是很简单嘛,你把这个整数乘以1,乘以2,……,就能得到很多的倍数呀。”明明的爸爸当然知道这种方法,但是他接着说:“这样的...

qq_39338091的博客 224

Vue/React动态页面爬取:不用Playwright也能抓全数据的3个JS逆向技巧(附Python代码)

Vue/React动态页面的爬取核心是“绕过渲染,直达数据”:90%的场景下,API接口或初始数据足以满足需求,Playwright等渲染工具只应作为“最后手段”(如无API、参数加密极复杂)。记住:爬虫的效率与“模拟真实浏览器的程度”成反比——越少模拟浏览器,效率越高。掌握JS逆向技巧,既能避开Playwright的性能坑,又能提升爬虫的抗反爬能力,这才是动态页面爬取的最优解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1597

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

用python输出倍数_打印n的前m个倍数,而无需在Python中使用任何循环

在本教程中,我们将编写一个不使用循环即可找出数字n的m倍的程序。例如,我们有一个数字n = 4和m = 3,输出应为4、8、12。三的四的倍数。在此,主要约束是不使用循环。我们可以使用range()函数获得所需的输出而无需循环。该range()方法的作用是什么?range()函数返回一个范围对象,我们可以将其转换为迭代器。让我们看看range()的语法。语法range(start,end,st...

weixin_39637661的博客 1596

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

敲7输出7和7的倍数,还有包含7的数字例如(17,27,37...70,71,72,73...)

题目描述 输出7和7的倍数,还有包含7的数字例如(17,27,37…70,71,72,73…) 输入 首先输入一个整数t,表示有t组数据。 然后有t行,每行一个整数N。(N不大于30000) 输出 对于每组数据 ,输出从小到大排列的不大于N的与7有关的数字。每组数据占一行,每个数字后面有一个空格; 样例输入 2 20 30 样例输出 7 14 17 7 14 17 21 27 28 # inclu...

Du798566的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝桥杯 求自然数序列的最小公倍数

为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。 事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。 我们希望寻找到能除尽1至n的的每个数字的最小整数。 不要小看这个数字,它可能十分大,比如n=100, 则该数为: 69720375229712477164533808935312303

vinci_lau的专栏 3370

求质因数只包含2,3,5的第n个数字

题目描述:如果一个正整数,它的质因数只包含2,3和5,那么这个数就满足条件。同时,规定1也满足条件。示例:前十个满足条件的数字:1,2,3,4,5,6,8,9,10,12请编写一个函数,返回第n个满足条件的数。输入描述:输入为n输出描述:输出为第n个满足条件的树。解题思路:       所有满足条件的数:11    ...

alixiashu的博客 8585

电信L2-列表取n个数使得和(k的倍数)最大

取n数使得和最大(k的倍数)

minvini的博客 1712

1103 N的倍数

一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数。 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数。 Input 第1行:1个数N,N为数组的长度,同时也是要求的倍数。(2 <= N <= 50000) 第2 - N + 1行:数组A的元素。(0  Output 如果没有符

楚天千里清秋,水随天去秋无际 400

和为k的倍数(51Nod-2522)

题目 小b喜欢和为K的倍数的序列。 现在有一个长度为n的序列A,请问A有多少个非空连续子序列是小b喜欢的。 输入 第一行输入一个正整数n; 第二行输入n个整数,表示A[i],以空格隔开; 第三行输入一个正整数K; 其中1≤n≤30000,对于任意A[i]有-10000≤A[i]≤10000,2≤K≤10000 输出 输出一个数,表示子序列的数目 输入样例 6 4 5 0 -2 -...

Alex_McAvoy的博客 2005

游游的9的倍数

你这么看肯定是看不懂的啊,你得看dp[4][1]里面的 1 是怎么来的,是a[i]+j 得到的,也就是(8+2)%9=1。首先是前一个位置余数是 (j+a[i])%9 的数量,也就是dp[i-1][(j+a[i])%9],也就是说不算当前 i 位置的数,就已经有这些数量了。dp[i][(j+a[i])%9],就应该是当前位置余数是(j+a[i])%9的数量加上当前位置之前的余数是 j 的数量,这样才是总数量。dp[i][(j+a[i])%9]:i 位置及之前余数是 (j+a[i])%9 的数量。

小飞猪的博客 612

51nod 1103 N的倍数 思路:抽屉原理+前缀和

题目: 这是一道很神奇的题目,做法非常巧妙。巧妙在题目要求n个数字,而且正好要求和为n的倍数。   思路:用sum[i]表示前i个数字的和%n。得到sum[ 1-N ]共N个数字。    N个数字对N取模,每个数字都在0-( N-1 )之间。    可能出现两种情况  1:有一个数字等于0。(都不相等)   2:至少有两个数字相等。       1.如果sum数组中有一个数字

xiaojiejie123s的博客 309

第 N 个神奇数字

每日一题2022/11/22

青釉Oo的博客 301

错题记录——数学填空题(本质考找最小公倍数)

这个规律适用于任意两个正整数 a 和 b,只要它们的最小公倍数存在。最小公倍数 L 是 a 和 b 的倍数序列的“重合点”,之后的序列会周期性地重复。

2401_89583057的博客 947
上一篇: 关闭使用某个DLL的进程
下一篇: 利用文件哈希值进行排重的Python脚本
CodeArhat
博客等级 码龄15年 13粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值