P1147 连续自然数和(数论,洛谷,java)

洛谷链接:https://www.luogu.com.cn/problem/P1147

在这里插入图片描述
1.暴力解法

import java.util.Scanner;
public class Main {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
        int M=in.nextInt();
        
        for(int i=1;i<=M/2;i++) {   //注意i=1
        	int sum=0;              //每次要清0
        	for(int j=i;j<=M;j++) {
        		sum+=j;
        		if(sum==M) {
        			System.out.println(i+" "+j);
        		}
        		if(sum>=M) { break; }  //不退出很耗时
        	}
        }
	}
}

2.数论解法
设首项为L,末项为R,那么sum(L,R)=(L+R)(R-L+1)/2=M

即(L+R)(R-L+1)=2M

可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1<K2时,

可以列一个二元一次方程组

R-L+1=K1

L+R=K2 解得L=(K2-K1+1)/2, R=(K1+K2-1)/2

当K1,K2一奇一偶时,L,R才有自然数解.

不过有一种特殊情况,就是L=R的情况,这种情况是不允许的

即(K2-K1+1)/2≠(K1+K2-1)/2,解得K1≠1

import java.util.Scanner;
public class Main {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
        int M=in.nextInt();
        
        for(int k1=(int) Math.sqrt(2*M);k1>1;k1--) {  //枚举k1(注意是k1>1而不是k1>=1)
        	if(2*M%k1==0  &&  (k1+2*M/k1)%2==1) {   //如果K2是整数而   且   k2与K1一奇一偶
        		int k2=2*M/k1;
        		System.out.println((k2-k1+1)/2+" "+(k1+k2-1)/2);
        	}
        }
	}
}
发布了86 篇原创文章 · 获赞 46 · 访问量 1714

猜你喜欢

转载自blog.csdn.net/weixin_44685629/article/details/104210344