用自然数之和来表达整数

一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。

输入描述

一个目标整数T(1<=T<=1000)

输出描述

该整数的所有表达式和表达式的个数。如果有多种表达式,输出要求为:

1.自然数最少的表达式优先输出

2.每个表达式中的自然数按递增的顺序输出,具体格式参见样例。在每个测试数据结束时,输出一行“Result:X”,其中X是最终表达式的个数。

示例1:

输入

9

输出

9=9

9=4+5

9=2+3+4

Result:3

import java.util.Scanner;

public class ContinuSum {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /**
         * 输入
         * 9
         * 
         * 输出
         * 9=9
         * 9=4+5
         * 9=2+3+4
         * Result:3
         * */
        Scanner in = new Scanner(System.in);
        int n= in.nextInt();
        findNum(n);
        in.close();
    }
     public static void findNum(int sum){
            int startNum = 0;
            int count = 1;
            System.out.println(sum + "=" + sum);
            /**
             * 研究此题发现实际上是求一个公差为1的等差数列,设首项为x,根据等差数列求和可知sum = (x+(x+(n-1)))*n/2
             * 可以推导出首项为x = (sum - n*(n-1)/2) / n = (2*sum -n*(n-1)) / 2*n
             * 由于不知道n具体为几项,则通过循环获取,其中若要n最大时,可考虑首项为1
             * 即可得到sum >= (1+(1+(n-1)))*n/2
             * 推导出sum >= n*(n+1)/2 可得出 n*(n+1)<=2*sum
             */
            for (int i = 2; i * (i + 1)<= 2 * sum; i++) {//此处变量设置n为要表示的整数,i为项数,根据题目要求可知i最小为两项
                if((2 * sum - i * (i - 1)) % (2 * i) == 0){//求余,若除数为零说明此时的项数i可求得满足条件的首项
                    startNum = (2 * sum - i * (i - 1)) / (2 * i);//首项
                    if (startNum>0){//排除可能为负数的情况
                        StringBuilder result = new StringBuilder();
                        for (int j = 0; j < i; j++) {//打出所有的项
                            result.append(startNum++).append("+");//先打印再做变量自增
                        }
                        result.deleteCharAt(result.length()-1);//截取掉末尾的+号
                        System.out.println(sum + "=" + result);
                        count++;
                    }
                }
            }
            System.out.println("Result:"+count);
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值