用连续自然数之和来表达整数

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

注意!答案仅作为参考(实际考试中下列代码通过用例100%,但不代表最优解)
一个整数可以由连续的自然数之和来表示
给定一个整数
计算该整数有几种连续自然数之和的表达式
并打印出每一种表达式

输入描述
一个目标整数t 1<= t <=1000

输出描述
1.该整数的所有表达式和表达式的个数
如果有多种表达式,自然数个数最少的表达式优先输出
2.每个表达式中按自然数递增输出

具体的格式参见样例
在每个测试数据结束时,输出一行"Result:X"
其中X是最终的表达式个数
输入
9

输出
9=9
9=4+5
9=2+3+4
Result:3

说明 整数9有三种表达方法:

示例二
输入
10
输出
10=10
10=1+2+3+4
Result:2

以上为华为笔试真题,本篇文章不保证代码完全与输出样例相同,只为更易读懂

话不多说,上代码

package com.test.bi;

import java.util.Scanner;

/**
 * 【用连续自然数之和来表达整数】一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。
 */
public class ZiRanShu {
    public static void main(String[] args) {
        while (true){//只是做个循环输入方便测试
            System.out.println("请输入一个整数:");
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            mothd(n);
        }
    }
    public static void mothd(int n){
        int startNum = 0;
        int count = 1;
        System.out.println(n + "=" + n);
        /**
         * 研究此题发现实际上是求一个公差为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 * n; i++) {//此处变量设置n为要表示的整数,i为项数,根据题目要求可知i最小为两项
            if((2 * n - i * (i - 1)) % (2 * i) == 0){//求余,若除数为零说明此时的项数i可求得满足条件的首项
                startNum = (2 * n - 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(n + "=" + result);
                    count++;
                }
            }
        }
        System.out.println("可用的连续自然数表示方法共有"+count+"种");
    }
}

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值