一、题目
一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。
二、思路与代码过程
1.思路
从键盘输入一个N之后,利用公式确定k(连续长度)的范围为:k*k≤2*N,对k进行遍历,遇到符合(2*N/k-k+1)%2==0的时候,若此时的起始值a为自然数(非负整数),则将此时的起始值a与连续值长度k加入表达式的构建。
2.代码过程
①main函数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数整数:");
int N = sc.nextInt();
List<String> expressions = findExpressions(N);
System.out.println("该整数有"+expressions.size()+"种由连续自然数之和的表达方式,详情如下:");
for (String expression : expressions) {
System.out.println(expression);
}
}
②findExpression函数
利用公式遍历查找k的值,将成功值传入buildExpression函数,接收它构建好的String,并加入expressions字符串表。
private static List<String> findExpressions(int N) {
List<String> expressions = new ArrayList<>();
for (int k=1;k*k<=2*N;k++){
if(2*N%k==0){
if((2*N/k-k+1)%2==0){
int a = (2*N/k-k+1)/2;
if(a>0){
expressions.add(buildExpression(a,k,N));
}
}
}
}
return expressions;
}
③buildExpression函数
负责接收findExpression函数传来的a,k,用StringBuilder构建表达式。构建完成后以String形式返回给findExpression。
private static String buildExpression(int a, int k, int N) {
StringBuilder sb = new StringBuilder();
for (int i=0;i<k;i++){
if (i>0)sb.append("+");
sb.append(a+i);
}
sb.append("=").append(N);
return sb.toString();
}