试题 算法训练 连续正整数的和
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。
输入一个正整数 n(<=10000)
输出 m 行(n有m种表示法),每行是两个正整数a,b,表示a+(a+1)+…+b=n。
对于多种表示法,a小的方案先输出。
样例输入
78
样例输出
1 12
18 21
25 27
方法一
import java.util.Scanner;
public class Main09 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int gridSum[][]=new int[n+1][n+1];//gridSum[a][b] a到b的和
//数组值初始化
for (int i = 1; i <=n; i++) {
gridSum[i][i]=i;
}
//计算a到b的和
for (int a = 1; a <=n; a++) {
for (int b = a+1; b <=n; b++) {
gridSum[a][b]=gridSum[a][b-1]+b;
if (gridSum[a][b]==n) {
System.out.println(a+" "+b);
}
}
}
}
}
方法二
第一种方法内存消耗几乎是第二种的十倍,这题用等差数列方法做较好,应该是还有更好的方法的
import java.util.Scanner;
public class Main09 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for (int a = 1; a <n; a++) {
for (int b = a+1; b <n; b++) {
int c=b-a+1;
int Sn=c*a+c*(c-1)/2*1;
if (Sn==n) {
System.out.println(a+" "+b);
}
}
}
}
}