`
Tveiker
  • 浏览: 55792 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

将n分解成连续整数之和

阅读更多
  从键盘输入一个数,然后求出连续整数相加使其和刚好和输入的数相等。
  如:15=1+2+3+4+5
       15=4+5+6
       15=7+8
开始想了很久,并且一直在想计算,比如例举所有...这肯定能实现,但是效率不高。后来想起了等差数列来计算。这时候就只要寻找合适了首项以及对应的长度即可。
对于一个L个步长为1首项为a1的等差数列和S=(2a1+L-1)*L/2  ===>L^2-(2a1-1)L-2S=0==>令b=2a1-1 则
L=(-b+sqrt(b^2+8S))/2.
所以此时先判读 delta=b^2+8S是否是完全平方数,是则看delta-b是否能被2整除,如果满足则此时a1满足条件,计算出L,然后从a1打印到a1+L-1即可。上面两个如任何一个不满足则计算下一个a1.
代码如下还请各位大侠帮忙看看啊,是否达到了要求

/****************************************************
 *    copyright (c) 383569614@qq.com
 *   2012-08  AT  Hunan University
 *****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*
 * 功能:判断一个整数是否是完全平方数
 * 参数:x要判断的整数,*val 所得到开方数
 * 返回:是完全平方数返回1,否则返回0
 */
int issqrt(int x,int *val)
{
	double s=sqrt((double)x);
	double dx=s-(int)s;
	*val=(int)s;
	return dx<1e-7;
}

/***************************************
 * 功能:查找首项a1,以及找到对应的项数L
 * 参数:a1要测试的首项,*L求得对应项数,
 *      a1不适合时为任意值。sum则是输入
 *      那个需要分解的总和。
 * 返回:a1适合返回1否则返回0
 ***************************************/
int findfirst(int a1,int *L,int sum)
{
	int tem=0;
	int delta;
	int *sq;
	tem=(a1<<1)-1;
	delta=tem*tem+8*sum;
	sq=(int *)malloc(sizeof(int));
	if(issqrt(delta,sq))
	{
		tem=*sq-tem;
		if(!(tem&0x01))
		{
			*L=tem>>1;
			free(sq);
			return 1;
		}
		free(sq);
		return 0;
	}
	free(sq);
	return 0;
}

/************************************************
 * 功能:打印连续的整数
 * 参数:a1连续整数的第一个整数,L整数的个数
 * 返回:无
 ************************************************/
void display(int a1,int L)
{
	int i=1;
	printf("%d",a1);
	for(i=1 ; i<L ; i++)
	{
		printf("+%d",a1+i);
	}
	printf("\n");
}

int main()
{
	int a1=1;
	int n;
	int *L;
	L=(int *)malloc(sizeof(int));
	printf("Please Input a Integer(>0):");
	scanf("%d",&n);
	for( a1=1 ; a1< (n>>1)+1 ; a1++)
	{
		if(findfirst(a1,L,n))
		{
			printf("%d=",n);
			display(a1,*L);
		}
	}
	free(L);
	return 0;
}
1
3
分享到:
评论

相关推荐

    一个数分成几个连续整数和

    对于连续整数和问题,我们可以创建一个二维数组dp[i][j],表示是否可以将i拆分成不超过j个连续整数的和。通过填充这个数组,我们可以找到所有可能的拆分方式。 在实际应用中,连续整数和的问题可能会有一些变种,...

    中国科学技术大学计算机学院硕士研究生复试机试试题之给出一个整数分解成尽可能多的连续整数的和

    题目要求将一个给定的整数分解为尽可能多的连续整数之和。 **题目解析:** 假设我们需要将整数`N`分解为连续整数的和。设这些连续整数的第一个数为`n1`,最后一个数为`n2`,那么有: \[ N = n1 + (n1 + 1) + ... + ...

    最优分解问题

    最优分解问题是一个经典的数学优化问题,它涉及到如何有效地将一个正整数n分解为若干个互不相同的自然数之和,以使得这些自然数的乘积最大化。这个问题在计算机科学和算法设计中有着广泛的应用,特别是在寻找高效...

    连续整数检测法分解质因数法求最大公约数

    根据提供的文件信息,我们可以归纳出三个主要的知识点:利用连续整数检测法分解质因数求最大公约数、使用欧几里得算法求最大公约数以及字符串匹配算法(包括BF、KMP和BM算法)。接下来将对这些知识点进行详细的解释...

    整数分解C语言

    例如:1998+1999+2000+2001+2002=10000,是一个累加和等于 N 的连续的自然数段。 输出每个累加和等于 N 的连续的自然数段的第一个数和最后一个数,两数之间用符号~隔开,每段一行,所有行按每行的第一个数从小到大...

    二次整数场与合数分解

    最后,二次整数场的应用之一就是合数的分解。通过整数场,我们可以更有效地对奇合数进行分解。林从汉在这篇论文中提出了一类可简捷计算分解的奇合数,虽然文章中没有详细解释素数的特性,但提供了对合数特性的一些...

    计算两个整数的最大公约数

    第三步:从第一步和第二步求得的质因数分解式中找出所有的公因数(如果p是一个公因数,而且在m和n的质因数分解式中分别出现过pm和pn次,那么应该将p重复min{pm,pn}次)。 第四步:将第三步中找到的质因数相乘,其...

    求最大公约数的三种算法

    本篇将详细介绍三种不同的方法来求两个自然数m和n的最大公约数:欧几里得算法、分解质因数法以及连续整数检测法。 1. **欧几里得算法**: 欧几里得算法,又称辗转相除法,是公元前3世纪由古希腊数学家欧几里得提出...

    整数划分问题

    例如,将数字15划分成连续正整数之和,有以下几种情况: - 15 - 7 + 8 - 4 + 5 + 6 - 1 + 2 + 3 + 4 + 5 为了找到所有可能的连续整数划分,可以考虑一般形式: - 设 \( n \) 为被划分的正整数,\( x \) 为划分后...

    一本书的页码从自然数1 开始顺序编码直到自然数n。

    首先,我们需要将问题简化,将其分解为更小的部分来逐步解决。 #### 数字分布规律 考虑n = 100的情况,我们可以观察到: - 个位数0至9各出现10次; - 十位数0至9各出现10次; - 百位数只出现1次。 这个规律可以...

    新北师大版八年级数学下册第四章《因式分解》测试卷.pdf

    条件0)(22222cabcba意味着两边之和等于第三边,这表明a,b,c是等腰三角形的边长,因此答案是A. 等腰三角形。 6. 分解因式技巧:解答题部分如第18题,要求学生对多项式进行因式分解,如1))()(422abbax,2)222224)...

    动态规划 划分最小和

    这个问题是经典的动态规划问题,旨在找到一种方法将一个包含正整数的序列划分为连续的子序列,使得所有子序列和的最大值尽可能小。我们来深入探讨这个问题的解决方案。 首先,我们要理解问题的关键在于找到一个合适...

    最大公约数的三种算法复杂度分析时间计算.docx

    连续整数检测法的时间复杂度为 O(n),其中 n 是两个自然数 m 和 n 的较小值。该算法的实现较为简单,但其时间复杂度较高,特别是在两个自然数很大的情况下。 欧几里得算法的时间复杂度为 O(log n),其中 n 是两个...

    整数与多项式1

    例如,整数乘法可以通过将一个数自身连续相加n次来理解,即`a * n = a + a + ... + a (n个)`。这种简单的概念在编写算法时经常被用到,例如在处理数组、序列的累计和等问题时。 整数的性质在解决问题时非常重要,如...

    快速搜寻N以内的素数,Fortran95规范格式

    本程序避开了逆向的递归过程,巧妙转化成有相近效果的正向搜寻,所涉及的运算模式只有整数运算。 Fortran90/95规范格式,结果输出到文件。 注意N的设置不要过大,可能出现内存不足,N应满足:N&lt;(可用最大连续内存...

    因式分解知识点分类练习.doc

    2. 证明题:通过因式分解证明某些数学性质,如证明`n(n+1)(2n+1)`是6的倍数(因式分解后有2n+1=2n+n,n(n+1)是连续整数,必有一偶数,所以乘积是6的倍数) **六、因式分解解应用题** 1. 利用因式分解解决实际问题,...

    新北师大版八年级数学下册因式分解单元检测.pdf

    17. 多步因式分解:第 22 题展示了如何逐步分解一个看似复杂的多项式,通过提取公因式和连续展开,最终达到最简形式。 总结,本单元检测重点在于因式分解的技巧,包括提取公因式、应用平方差公式和完全平方公式,...

    基于离散小波变换的信号分解算法研究

    离散小波变换的核心思想是通过尺度因子和平移因子的离散化,将连续小波变换转化为适合计算机处理的形式。 ##### 2.1 尺度因子和平移因子的离散化 在离散小波变换中,尺度因子α和平移因子b分别表示了小波函数的...

    八年级上册数学因式分解和分式总复习.doc

    在拓展提高部分,有更复杂的因式分解题目,以及对因式分解过程的理解和应用,例如通过连续应用相同的方法分解多项式。 总的来说,这份文档提供了全面的复习材料,涵盖了八年级上册数学中关于因式分解和分式的各种...

Global site tag (gtag.js) - Google Analytics