`
QuarterLifeForJava
  • 浏览: 177718 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

找出所有符合情况的连续正整数

阅读更多
不废话了,直接上代码:
package test;

import java.util.ArrayList;
import java.util.List;

/**
 * 题目描述:一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
 * 15=1+2+3+4+5
 * 15=4+5+6
 * 15=7+8
 * 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
 * 申明:只是提供了一种较好的算法,必然存在更好的
 * 这是我一位同事的算法,思路很不错,借鉴了
 * 缺点:2*i如果大于int的最大范围就不行了
 */
public class Test {
	
	private static int maxNum =0;
	
	private static List<int[]> list= new ArrayList<int[]>();
	
	public static void main(String[] args) {
		long start=System.currentTimeMillis();
		int num=15;
		calculate(num);
		show(num);
		long end = System.currentTimeMillis();
		System.out.println(end -start);
	}
	
	//核心算法
	private static void judge(int i,int num){
		//maxNum要理解为项数,同时也表示连续整数和最多也就maxNum项
		//因此对于16最多maxNum(6)项相加
		/**
		 * 第一轮:
		 * 第一次:1+2+3+4+5+6 	符合结束循环,不符合继续
		 * 第二次:1+2+3+4+5		符合结束循环,不符合继续
		 * 第三次:1+2+3+4			符合结束循环,不符合继续
		 * 第四次:1+2+3 			符合结束循环,不符合继续
		 * 第五次:1+2				符合结束循环,不符合继续
		 * 第六次:1 				符合结束循环,不符合继续
		 * 
		 * 第二轮:
		 * 第一次:2+3+4+5+6+7 	符合结束循环,不符合继续
		 * 第二次:2+3+4+5+6		符合结束循环,不符合继续
		 * 第三次:2+3+4+5 		符合结束循环,不符合继续
		 * 第四次:2+3+4 			符合结束循环,不符合继续
		 * 第五次:2+3 			符合结束循环,不符合继续
		 * 第六次:2
		 * 
		 * 第最后轮:
		 * 第一次:8+9+10+11+12+13  符合结束循环,不符合继续
		 * 第二次:8+9+10+11+12	符合结束循环,不符合继续
		 * 第三次:8+9+10+11 		符合结束循环,不符合继续
		 * 第四次:8+9+10 			符合结束循环,不符合继续
		 * 第五次:8+9 			符合结束循环,不符合继续
		 * 第六次:8				符合结束循环,不符合继续
		 */
		
		/** 因为是等差数列,当只知道首项(i)和项数(maxNum)时,
		 *  要求首项+末项的和(当然末项也是能求出的,这里用不到)
		 *  公式为:(2*i+maxNum-1)=首项+末项的和=首项*2+项数-1
		 */
		//judgeNum=(首项+末项的和)*项数
		int judgeNum =maxNum*(2*i+maxNum-1);
		while(judgeNum >=2*num){
			if(judgeNum == 2*num){
				int[] a=new int[2];
				a[0]=i;//得到的是首项
				a[1]=maxNum;//得到的是项数
				list.add(a);
				break;
			}else{
				maxNum --;
				if(maxNum < 0){
					break;
				}
				judgeNum=maxNum*(2*i+maxNum-1);
			}
		}
	}
	
	//得到项数,该方法用法只执行一次
	private static int getMaxNum(int start,int num){
		int count =0;
		int i=0;
		for(i=start;i<num;i++){
			count+=i;
			if(count >=num){
				System.out.println(i);
				return i;
			}
		}
		return num;//为了满足语法,其实是根本不会走到的
	}
	
	private static void calculate(int num){
		maxNum=getMaxNum(1,num);//得到项数
		/**
		 * 以15为例
		 * 1+2+...+15    //其中加到某一个数,有可能符合情况
		 * 2+3+4+...+15  //其中加到某一个数,有可能符合情况
		 * ...           //其中加到某一个数,有可能符合情况
		 * 7+8+...+15    //其中加到某一个数,有可能符合情况
		 * 最多加到其一半的情况,即15最多是7+8,永远不可能是8+9
		 * 所以一个数最多加到其一半,不然就要超过这个数了
		 * 如101最多50+51,永远不可能从51开始,即51+52
		 */
		for(int i=1;i<=num/2;i++){
			judge(i,num);
		}
	}
	
	/**
	 * 这里是输出的逻辑,虽然输出看似比较繁琐,但是占用的时间很少,不影响效率
	 * a[0]=i;       //得到的是首项
	 * a[1]=maxNum;  //得到的是项数
	 */
	private static void show(int num){
		for(int i=0;i<list.size();i++){
			int[] ret=list.get(i);
			int start =ret[0];
			int count=ret[1];
			int[] show =new int[count];
			System.out.print(num+" = ");
			int flag =0;
			for(int j=0;j<count;j++){
				show[j]=start+j;
				if(j==0){
					System.out.print(" "+show[j]);
				}else{
					System.out.print(" +"+show[j]);
				}
				flag ++;
				if(flag >20000){
					System.out.println();
					flag =0;
				}
			}
			System.out.println();
		}
	}
}
1
3
分享到:
评论

相关推荐

    求出所有和为1000的连续正整数

    这个问题要求我们找出所有连续正整数序列,其和等于1000。这是一个典型的数学与编程结合的问题,我们可以利用JavaScript来实现。下面将详细阐述解决此问题的方法。 首先,我们需要明确一点:连续的正整数序列可以...

    C++初学者之根据输入的任何一个正整数,输出可能被表示的连续正整数

    这个问题的目的是编写一个程序,根据用户输入的任意正整数,找出所有能表示这个数的连续正整数序列。例如,如果输入是15,程序应输出1 2 3 4 5、4 5 6 和7 8,因为15可以由这些连续的正整数序列相加得到。 首先,...

    对数据的蛋疼拆解

    一个正整数有可能可以被表示为 m(m&gt;=2) 个连续正整数之和,如: 15 = 1 + 2 + 3 + 4 + 5 ...编写一个程序,输入一个正整数,然后找出符合这种要求的所有连续正整数序列,若不存在这种序列,则打印None。

    百度之星程序设计大赛试题.doc

    这道题要求编写程序找出所有能表示成连续正整数之和的方式。输入是一个正整数,程序应输出所有符合条件的连续正整数序列。解题的关键在于找到所有可能的起始点,然后检查该起始点开始的连续序列是否加起来等于输入值...

    微软面试题 连续相加等于500

    这是一道来自微软的面试题,题目要求找出能够连续相加等于500的所有整数序列,并使用C#语言实现。 ### 二、核心算法解析 #### 1. 算法思路 题目中的代码实现了一个算法来寻找所有可能的连续整数序列,使得这些整数...

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

    - 函数的输入输出参数需要清晰理解,例如`fun`函数需要根据输入的字符串`n`找出连续正整数序列,输出符合条件的序列。 8. **数组与指针**: - 数组在C语言中本质上是内存中连续的元素集合,可以使用指针来访问和...

    2005年百度之星程序设计大赛试题初赛题.doc

    请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。 输入数据:一个正整数,以命令行参数的形式提供给程序。 输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个...

    百度编程大赛初赛练习题

    本题考查的是如何判断一个正整数是否能表示为至少两个连续正整数之和,并找出所有可能的组合方式。 **示例**: - 例如数字15可以表示为: - 1 + 2 + 3 + 4 + 5 = 15 - 4 + 5 + 6 = 15 - 7 + 8 = 15 **题目要求...

    百度之星历届赛题

    在这个题目中,要求编写程序来找出符合要求的所有连续正整数序列。该程序需要根据输入的正整数,找出所有可能的连续正整数序列,并将其输出。例如,对于输入15,输出结果是:1 2 3 4 5、4 5 6、7 8。这个题目考察了...

    jiafa.rar_4 3 2 1_jiafa.com

    题目描述:  一个正整数有可能可以被表示为n(n&gt;... 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。  输入数据:一个正整数,以命令行参数的形式提供给程序。

    matlab 简单程序

    该MATLAB程序的功能是接收用户输入的一个正整数`n`,并找出所有可能的正整数组合,使得这些组合中的整数之和等于输入的`n`。具体来说,如果存在若干个正整数序列,使得序列中的数字相加等于`n`,则程序将输出这些...

    历年百度之星程序设计大赛试题题目

    题目描述:编写程序,根据输入的任何一个正整数,找出符合要求的所有连续正整数序列。 输入数据:一个正整数,以命令行参数的形式提供给程序。 输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一...

    历年百度之星程序试题

    在此试题中,需要编写程序,根据输入的任何一个正整数,找出符合要求的所有连续正整数序列。例如,对于输入 15,输出结果是:1 2 3 4 5 4 5 6 7 8。这道题目考察了候选人的数论知识和算法设计能力。 试题二:重叠...

    八年级数学上册 11.1.1 三角形的边课时训练 (新版)新人教版.doc

    11. 探索性问题:对于特定条件(如最长边为9),需要找出所有满足条件的正整数边长的三角形组合,这涉及到对整数的枚举和排除。 12. 三角形不等式:在解答中考或竞赛题时,会用到三角形不等式来解决线段长度的问题...

    安装j2sdk以后,需要配置一下环境变量,

    Java 环境变量配置 在安装 J2SDK 之后,需要配置环境变量,以便正确地使用 Java 开发工具。环境变量配置是 Java 开发的基础步骤,...请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。

    C语言课程设计报告.docx

    - **目标**:对于一组给定的正整数,找出最长的连续自然数序列的长度。 - **输入**:n个正整数。 - **输出**:最长连续自然数序列的长度。 - **实现思路**: - 输入一组正整数,并存储在一个数组中。 - 对数组进行...

Global site tag (gtag.js) - Google Analytics