利用递推法求最小数生成问题,求阶乘问题

双关系递推数列 集合M定义如下:(1)1∈M;(2)x∈M→2x+1∈M,3x+1∈M;(3)再无别的数属于M;试求集合M的元素从小到大排序的第n个元素;1.枚举设计求解:该题有2x+1和3x+1 两个递推关系,加大了程序设计难度;(1)设计要点;设置变量i:i从2开始递增1取值,若i可有已有的项m(j)用两个递推关系之一堆得,即满足条件i=2*m(j)+1或i=3*m(j)+1,说明i是m数列中的一项,赋值给m( 阅读详情



/* 利用递推法求最小数生成问题 

   例:按递增次序生成1个集合M的最小的n个数.M定义如下:
   1、1属于M
   2、若x属于M,则2x+1属于M,3x+1属于M
   3、无别的数属于M
   1为n个数中的第1个数,再右1递推出余下的n-1个数。从两个队列(2x+1,3x+1)选一个“排头”
   (两个队列中,尚未选入的第1个小的数)送入数组M中。
*/

#include 
"stdio.h"
#define M 100
main()
{
    
int m[M];
    
int
 n,p2,p3,i;
    m[
1]=p2=p3=1;                /* 设p2表示2x+1,p3表示3x+1 */

    printf(
"please Input number:");    
    scanf(
"%d",&
n);
    
    
for(i=2;i<=n;i++
)
    {
        
if(2*m[p2]==3*m[p3])    /* p2==p3 数组放入任一个,调整p2,p3*/

        {
            m[i]
=2*m[p2]+1;
            p2
++
;
            p3
++
;
        }
        
else if(2*m[p2]<3*m[p3])/* p2<p3 数组放入p2的排头,调整p2*/

        {
            m[i]
=2*m[p2]+1;
            p2
++
;
        }
        
else                    /* p2>p3 数组放入p3的排头,调整p3*/

        {
            m[i]
=3*m[p3]+1;
            p3
++
;
        }
    }
    
/*OUTPUT*/

    
for(i=1;i<=n;i++)
    {
        printf(
"%4d"
,m[i]);
        
if(!(i%10))        printf(" "
);
    }
}

 

/*  利用递推法求阶乘问题 
    
    例:对给定的n(n<=100),计算并输出k的阶乘k!(k=1,2,...,n)的全部有效数字)
    如:5!=120;
    由于结果可能超过一般整数位数,所以用一个长度为1000的数组来存放结果的各个位数,
    数组的第1个元素,存放结果的位数,数组其余部分,依次存放个位,十位,百位...
    如:120,位数为3,则数组存放:3021(a[0]=3,a[1]=0,[2]=2,[3]=1)

*/

#include 
"stdio.h"
#include 
<malloc.h>
#define MAXN 1000
/*
  方法pnext().已知a中的(k-1)!,求k!,只要把a中的结果再加a中原值k-1次(因为a中有一次了),就得k!
  如:4!=24,把24再加上4次24就得120,即5!
*/
void pnext(int a[],int k)    
{
    
/* m=a[0]存放整数位数,carry存放进位值*/

    
int *b,m=a[0],i,j,r,carry;
    b
=(int *)malloc(sizeof(int)*(m+1
));
    
for(i=1;i<=m;i++
)
        b[i]
=a[i];                 /*把a中的结果放b中*/

        
    
for(j=1;j<k;j++)             /*把a中的结果再(注意是再)加a中原值k-1次*/
    {
        
for(carry=0,i=1;i<=m;i++)/*把a,b对应的每1位(总位数m)相加*/
        {
            r
=(i<=a[0]?a[i]+b[i]:a[i])+carry;
            a[i]
=r%10;             /*得出本位*/

            carry
=r/10;             /*得出进位*/
        }
        
if(carry)
            a[
++m]=carry;         /*进位放a中,同时更新a中数字的总位数m*/

    }
    free(b);
    a[
0]=m;
    
}
void write(int *a,int
 k)
{
    
int
 i;
    printf(
"%4d!="
,k);
    
for(i=a[0];i>0;i--
)
        printf(
"%d"
,a[i]);
    printf(
" "
);
}
main()
{
    
int
 a[MAXN],n,k;
    printf(
"Enter the number n:"
);
    scanf(
"%d",&
n);
    a[
0]=1;    a[1]=1;        /*前两个位已知*/

    write(a,
1);                /*输出1!=1 */
    
for(k=2;k<=n;k++)
    {
        pnext(a,k);            
/*计算k的阶乘*/

        write(a,k);            
/*输出k的阶乘*/
        getchar();    
    }
}

 

程序设计:常见算法 有错,但是不想改 阅读详情

相关推荐

编程实战:高效计算自然常数e的三种算法解析

本文详细解析了计算自然常数e的三种算法,包括循环嵌套法、阶乘函数法和递推优化法,帮助编程初学者和开发者高效实现数学公式的代码转换。通过性能比较和应用场景建议,读者可以根据需求选择最适合的算法,提升计算效率和代码质量。

weixin_29313239的博客 545

双关系递推队列---Java实现

思路: 首先,1属于集合M,x也属于集合M,那么x肯定是大于或者等于1的,然后,2x+1于3x+1也属于集合M,且要求求集合M的元素从小到大排序的第n个元素。那么,必然有2x>3x或2x<=3x的情况,说明2x与3x不能是在同一个数列,所以可以分成两个数列,一个是2x情况的数列,一个是3x情况的数列。 import java.io.BufferedReader; import jav...

Weleness的博客 4872

C++排列组合算法实战:从数学公式到高效代码实现

排列组合是算法与数据结构中的基础概念,广泛应用于计算机科学的多个领域,如算法设计、概率统计和搜索优化。其核心原理在于如何系统性地枚举有限集合的所有可能子集或序列。在编程实践中,直接套用数学公式常导致整数溢出和性能低下,因此需要特定的算法技术来保证正确性和效率。例如,计算组合数时,边乘边除法能有效避免大数溢出;生成全排列时,回溯算法和STL的next_permutation提供了不同的实现范式。这些技术的价值在于将抽象的数学问题转化为健壮、可复用的代码模块,是解决组合优化、密码学、游戏AI等场景中枚举问题的关

weixin_30719711的博客 435

关于线性筛法的题 2*x+1 3*x+1

关于线性筛法的题 编写一个程序,按递增的顺序生成集合m的最小的n的个数,m的定义如下:(n<=10000) (1)数1属于m (2)如果x属于m,则y=2x+1和z=3x+1也属于m; (3)此外再没有别的数属于m。 输入:输入一个正整数n 输出:输出集合里从小到大的前n个数 这道题实在有趣,可谓是把我搞的死去活来。 一开始我想的是分别把2x+1和3x+1的结果存入两个数组中去,再通过比较两个数的大小重新排序。 #include<iostream> #include<cstdio

weixin_50547586的博客 971

【kubeEdge】离线部署

根据k8s的这个规则,可以将节点通过 label 的方式进行分组,比如将某几个节点都打上标签为 name=edge,当调度应用到 edge 节点时,会找到 label 为 edge 的所有节点,根据设置的副本数,将应用启动起来,如果设置的副本数超过了设置 edge 标签的节点数,则多出的将会显示 pending 状态,从而无法启动。清除 keadm init 或 keadm join 造成的影响均可使用 keadm reset,这个操作会删除 /etc/kubeedge 下的文件,如有需要请提前备份。

qq_42944740的博客 1716

【LLM】ms-Swift框架下SFT与GRPO协同优化的高效训练策略

本文深入探讨了ms-Swift框架下监督微调(SFT)与群组相对策略优化(GRPO)的协同训练策略,提升大型语言模型(LLM)的性能与效率。通过创新的架构设计和两阶段训练流程,结合GRPO的群组奖励估计与动态基线调整技术,显著优化了数学推理等任务的准确率。文章还分享了计算资源高效利用和参数调优的实战经验,为LLM训练提供了实用指导。

green的博客 994

最小数生成

            问题描述:按递增次序生成集合M的最小n个数,M定义如下:        1属于M        若x属于M,则2x+1属于M,3x+1属于M        无别的数属于M要生成数组M中最小的n个数,首先1为这n个数的第一个数,再由1递推出余下的n-1个数。设n个数在数组M中,2x+1与3x+1均作为一个队列,两队列中选一个排头(数值较小者)送入数组M中,所谓排头就是队列中尚...

你好_晴天 936

工控上位机开发学习路线与核心技术解析

工控上位机开发是工业自动化领域的关键技术,通过计算机软件实现对工业设备的监控与控制。其核心在于掌握工业通信协议(如Modbus、OPC UA)、数据处理算法和可视化开发三大能力。上位机系统需要高效解析设备通信协议,处理实时数据,并提供直观的人机交互界面。在智能制造浪潮下,掌握C#语言和工业协议开发能力成为工程师的核心竞争力。典型应用场景包括生产线监控、设备远程运维等。本文基于工业现场实践经验,详解从协议解析到界面优化的全链路开发要点,特别针对Modbus协议调优、WPF性能优化等高频问题提供解决方案。

weixin_30376083的博客 550

C语言学习——递归法/递推法求n!

递归法/递推法求n!

weixin_63292027的博客 1018

Dify 实战:使用 Firecrawl 插件高效爬取微信公众号文章

本文介绍了如何利用Dify平台和Firecrawl插件构建微信公众号文章自动化采集系统。Dify作为开源LLM应用开发平台,结合Firecrawl的智能网页爬取能力,可轻松实现文章爬取、清洗和结构化存储。文章详细讲解了环境部署、插件安装以及工作流创建过程,通过可视化节点操作即可完成从URL输入到Markdown格式输出的全流程。该方案无需复杂代码,能有效解决反爬、动态渲染等问题,适用于知识库构建、模型训练等场景,显著提升开发效率。

SmartSi 1825

Moviepy自动化剪辑视频中的广告

本教程展示了如何使用 Python 中的 MoviePy 库,通过检测和剪辑广告段落来实现视频内容的清洁播放。通过广告检测算法和 MoviePy 剪辑功能的结合,可以自动化处理视频,极大提升编辑效率。在学习和应用中,理解广告检测的原理及其实现方法尤为重要,以便针对不同类型的视频进行调整。此外,MoviePy 的灵活性使其适用于多种视频编辑场景,适合自动化内容制作与优化。

Mr数据杨 3413

打卡第二十四天(问题:计算阶乘,打印九九乘法表,计算最大公约数的两种算法)

1.计算阶乘 这里给出递归和递推两种计算阶乘的程序。 #include&lt;stdio.h&gt; //递归法计算阶乘 long factorial(int n) { if(n==0||n==1) return 1; else return n*factorial(n-1); } //递推法计算阶乘 long factorial2(int n) { long ...

huangluping12345的博客 654

Python电商网站全站爬虫实战:以京东为例的数据采集与分析

随着电子商务的蓬勃发展,电商数据已成为市场研究、竞争分析和消费者行为研究的重要资源。本文详细介绍了如何使用Python最新技术栈构建一个高效的电商网站全站爬虫,以京东为例实现商品数据的自动化采集。文章涵盖了爬虫的法律与伦理考量、技术选型、反爬虫策略应对、分布式架构设计以及数据存储方案,并提供了完整的代码实现。本爬虫系统采用Scrapy-Redis分布式框架、Selenium动态渲染、智能代理轮换和机器学习验证码识别等先进技术,能够稳定高效地抓取京东全站商品数据,为电子商务研究提供数据支持。关键词。

2201_76125261的博客 414

C++编程竞赛中排列组合计算:从数学原理到高效代码实现

排列与组合是组合数学的核心基础概念,广泛应用于算法设计与问题建模。其数学原理涉及阶乘运算与有序/无序选择,但在编程实现中直接计算阶乘极易导致整数溢出。为解决此工程难题,需掌握安全高效的计算技术,如边乘边除算法或递推动态规划。这些方法的核心价值在于将数学逻辑转化为健壮、可维护的代码,有效处理边界条件与大数据范围。在信息素养大赛、蓝桥杯等编程竞赛中,此类技能是解决路径规划、资源分配等实际问题的关键。本文以典型真题为例,深入剖析**C++实现**与**整数溢出**防范,提供从问题抽象到代码调试的完整实践路径。

weixin_30387799的博客 362

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2028

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

算法竞赛——组合数实战技巧全解析

本文全面解析算法竞赛中组合数的实战技巧,涵盖递推法、阶乘逆元法、卢卡斯定理及高精度计算等核心方法。通过详细代码示例和典型例题剖析,帮助竞赛选手高效解决组合数计算问题,避免常见错误,提升算法竞赛表现。

weixin_30664051的博客 395

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++编程实战:从数学公式到代码,详解排列组合算法实现与优化

排列组合是算法竞赛与编程实践中的基础数学概念,它描述了从集合中选取元素的不同方式,是理解更复杂算法(如动态规划、回溯搜索)的重要基石。其核心原理在于区分元素顺序(排列)与忽略顺序(组合),并通过阶乘公式或递推关系进行计算。掌握排列组合的编程实现,能显著提升解决实际问题的能力,例如在资源分配、概率统计、密码学等场景中都有广泛应用。本文以信息素养大赛真题为例,深入探讨如何将数学公式转化为高效的C++代码,并针对整数溢出等常见问题,对比分析了公式法与动态规划法的优劣,为开发者提供了从理论到实践的完整解决方案。

weixin_30567225的博客 410

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

第五章总结

5.2.1for语句的基本语法 for语句的一般形式为: for(表达式1;表达式2;表达式3) 循环体语句; for语句的执行过程如下: ①首先计算表达式1。 ②判断表达式2,若其值为真(非0),则执行循环体语句,然后 执行第③步;若值为假(0),结束循环,转到第⑤步执行。 ③计算表达式3。 ④返回第②步继续执行。 ⑤循环结束,继续执行for语句的下一条语句。 大部分情况下,循环体语句为一复合语句。 for语句的执行流程如图5.2所示。 注意,表达式1只是在进人循环之前计算一次。表达式2、循环 体语句和表

wklname的博客 730

C++算法实战:组合计数核心方法与工程应用详解

组合计数是计算机科学中解决“有多少种可能”问题的数学基础,其核心在于计算排列与组合的数量。从原理上看,它通过阶乘、递推关系(如帕斯卡法则)或数论工具(如乘法逆元)将抽象的计数问题转化为可计算的模型。这一技术的价值在于,它能将指数级复杂度的暴力枚举优化为多项式时间的高效算法,是避免程序超时、提升代码性能的关键。在工程实践中,组合计数广泛应用于算法竞赛、动态规划状态转移、测试用例生成、概率计算以及路径规划等场景。本文聚焦于C++实现,深入剖析了直接计算、递推法、乘法逆元及卢卡斯定理等四大核心方法,并针对数值溢出

weixin_33946605的博客 761

习题4-2 求幂级数展开的部分和 (20 分)

浙大版《C语言程序设计(第3版)》题目集习题4-2 求幂级数展开的部分和 (20 分)二、题解c代码 习题4-2 求幂级数展开的部分和 (20 分) 已知函数e​x可以展开为幂级数1+x+x2/2!+x3​​/3!+⋯+xk/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。 输入格式: 输入在一行中给出一个实数x∈[0,5]。 输出格式: 在一行中输出满足条件的幂级数部分和,保留小数点后四位。 输入样例1: 1.2 输出样例1: 3.32

信处的博客 625

组合数递推算法精讲:从杨辉三角到动态规划优化

组合数计算是算法与数据结构中的基础概念,广泛应用于概率统计、动态规划和图论计数等领域。其核心原理基于帕斯卡恒等式,通过递推关系将复杂计算转化为查表操作,体现了空间换时间的经典优化思想。在工程实践中,面对高频查询和中等数据范围的场景,递推法通过预处理构建组合数表,能实现O(1)的查询效率,有效避免了直接阶乘计算中的取模运算陷阱。本文以杨辉三角为切入点,深入解析递推公式的两种理解方式,并结合动态规划思想,探讨其在算法竞赛与面试中的实际应用价值。

weixin_34245082的博客 279

常用算法——递推和递归算法

本篇介绍常用算法中的递推算法和递归算法。递推算法是一种顺序递推的数学关系模型算法,好比通项公式。递归算法:在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归算法实际上是一种调用自己的一种函数(递归函数),即函数结果最终返回的是一个确定的值而不再是这个函数结果的本身调用。介绍了分别用递推算法和递归算法求π、求阶乘、求斐波那契数列,用递归算法解决汉诺塔问题。

hz_zhangrl的博客 8427

Day 12

1、因为 0!=1,故可以将公式中初始的1 转化为 1/0!,使所有项统一为阶乘倒数 1/n!的形式,无需对初始项做单独的判断和累加处理,实现所有项的同等逻辑判断。2、通过一个临时变量 temp 存储当前项值,使用 1/(n+1)!= (1/n!) / (n+1) 递推计算下一项。3、错误的将 e、count、n 的初始值设为 1 ,导致当输入的阈值 threshold 大于1 时,错误的输出 1.000000 1,正确输出应为 0.000000 0。

m0_75248473的博客 965

c语言raptor函数,RAPTOR程序设计例题参考解析.doc

RAPTOR程序设计例题参考解析RAPTOR程序设计一、顺序结构编程1.输入任意一个华氏温度值,然后将其转换成摄氏温度输出。算法:c = 5 / 9 (f - 32)2.输入任意三角形的三边之长存入变量a、b、c中,然后计算并输出该三角形的面积。海伦公式:p = (a + b + c)/2 S = sqrt (p * (p - a) * ( p – b ) * ( p – c ))二、选择结...

weixin_33609654的博客 7854
上一篇: 【软件】强大的EPWING格式的日语词典
下一篇: 利用穷举法解决组合问题,背包问题,变量相等问题
aspnet2002web
博客等级 码龄21年 482粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值