`
Tveiker
  • 浏览: 54458 次
  • 性别: 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
分享到:
评论

相关推荐

    整数分解C语言

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

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

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

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

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

    求最大公约数(求公因数部分很经典的)

    连续整数检测 1. t = min {m , n}; 2. m 除以t , 如果余数为 0 , 则执行步骤 3 , 否则,执行第 4 步; 3. n 除以 t , 如果余数为 0 ,返回t 的值作为结果, 否则, 执行第 4 步; 4. t = t - 1 ,转第 2 步; 算法 2...

    2018计算机二级C语言考试真题汇总.docx

    例:给定程序MODI1.C中,函数fun的功能是:判断输入的任何一个正整数n,是否等于某个连续正整数序列之和。若是,则输出所有可能的序列,否则输出“不能分解”。  例如:当输入100时,输出:100=9+10+11+12+13+14+...

    世界500强面试题.pdf

    1.5.6. 输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数 ....... 116 1.5.7. 输入一个表示整数的字符串,把该字符串转换成整数并输出.............. 118 1.5.8. 给出一个数列,找出其中最长的单调...

    西南交通大学 算法分析与设计课程作业.zip

    某序列由n个元素组成,现希望将这个序列分成m段(m&lt;=n),每一段的元素必须在原序列中连续,这样的分法有很多种。在每一种分法中,每一段元素之和的最大值记为MAXSi(i表示其中的第i种分法)。请编写程序求这些MAXSi的...

    求最大公约数的三种算法

    求两个自然数m和n的最大公约数。 理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

    上海电机学院C语言实训答案

    ④ 由输入整数分解排序后的数组得到最大值和最小值: int getmaxn(int a[ ]) 返回值为最大值 int getminn(int b[ ]) 返回值为最小值 (13)函数 fun 的功能是:计算正整数num的各位上的数字之积。例如,若输入:...

    C语言程序设计-精选习题和案例

    主要案例:进制转换,闰年判断,计算器,水仙花数,九九乘法表,哥德巴赫猜想,图形输出,单词个数统计,首字母转换,正整数分解质因数,数字排列,扩展的素数问题,成绩分类,选手得分计算,连续非素数组,矩阵转置...

    《数据结构 1800题》

    16.设m.n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目。例f(5,3)=5, 有 5种表示方式:3+2,3+1+1,2+2+1,2+1+1+1,1+1+1+1+1。 ①以下是该函数的程序段,请将未完成的部分填入,...

    java 正则表达式

    下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序: function IP2V(ip){re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式if(re.test(ip)){return RegExp.$1*Math.pow(255,3))+...

    C语言程序设计标准教程

    在主函数中输入n值,并作为实参,在调用时传送给s 函数的形参量n( 注意,本例的形参变量和实参变量的标识符都为n, 但这是两个不同的量,各自的作用域不同)。 在主函数中用printf 语句输出一次n值,这个n值是实参n的...

    计算机二级公共基础知识

    性质4:具有n个结点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示取log2n的整数部分。 3. 满二叉树与完全二叉树 满二叉树是指这样的一种二叉树:除最后一层外,每一层上的所有结点都有两个子结点。在满二叉树中...

    解析功能引导。 第二部分 交叉方程的自然基础

    下界意味着对于所有足够大的整数n,OPE×必须在间隔[2Δ+ 2n,2Δ+ 2n + 4]中包含至少一个基数。 这些功能直接计算AdS 2中交叉对称的Witten交换图的OPE分解。因此,它们提供了SL(2)的Polyakov引导程序的派生,...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    6.1 连续整数固定和问题 6.2 表示成两个数的平方和 6.3 具有特殊性质的数 6.4 验证角谷猜想 6.5 验证四方定理 6.6 递归法寻找最小值 6.7 寻找同构数 6.8 验证尼科彻斯定理 6.9 三重回文数字 6.10 马克思手稿中的数学...

    硬件工程师培训教程000006).doc

    一个典 型的操作集包括与内部数据类型相关的基本算术指令(即实数和整数加法、减法、乘法和 除法等)、测试数据项性质(如是否为零,是正数或负数等)的指令 、对数据项的某一部 分进行存取和修改 (如在一个字中存取一...

Global site tag (gtag.js) - Google Analytics