孪生数

问题描述

给定搜索范围m和n(1<=m<n<=20000,m,n为正整数),试找出指定范围内的孪生数(输出时小数在前,大数在后)。

孪生数(也称亲密数):如果整数A的全部因子(包括1,不包括A本身)之和等于B,并且整数B的全部因子(包括1,不包括B本身)之和等于A,则称整数A和整数B为孪生数。

import java.util.Scanner;

public class Test2_5_1 {

	static void isTwins(int m,int n)
	{
		int[] a=new int[20000];
		int sum;
		for (int i=m;i<=n;i++)
		{
			a[i]=0;
		}
		for (int i=m;i<=n;i++)
		{
			sum=0;
			for (int j=1;j<i;j++)
			{
				if (i%j==0)
					sum += j;
			}
			if (sum>=m&&sum<=n&&sum!=i)
				a[i]=sum;
		}
		for (int i=m;i<=n;i++)
		{
			if (i==a[a[i]])
			{
				System.out.println(i+","+a[i]);
				a[a[i]]=0;
			}
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc =new Scanner(System.in);
		System.out.println("请输入两个数字:");
		int m = sc.nextInt();
		int n = sc.nextInt();
		isTwins(m, n);
		sc.close();
	}

}

优化后

求i的因数之和sum,直接对sum求因数之和s1,若s1等于i,那就证明i和s就是一对孪生数。然后用数组来存储已经找到的孪生数sum。每次求解孪生数前,用i与孪生数数组中的各值比较,若i已经存在数组中,不必再求解。进行下一次循环。

import java.util.Scanner;

public class Test2_5_2 {

	static void isTwins(int m,int n)
	{
		int sum,s1,t=0;
		int[] a=new int[100];
		for (int i=m;i<=n;i++)
		{
			for (int j=0;j<t;j++)
				if (i==a[j])
					i++;
			sum=0;
			for (int j=1;j<i;j++)
				if (i%j==0)
					sum += j;
			if (sum>=m&&sum<=n&&sum!=i)
			{
				s1=0;
				for (int j=1;j<sum;j++)
					if (sum%j==0)
						s1 += j;
				if (i==s1)
				{
					a[t++]=sum;
					System.out.println(i+","+sum);
				}
			}
		}
		if (t==0)
			System.out.println("NONE!");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc =new Scanner(System.in);
		System.out.println("请输入两个数字:");
		int m = sc.nextInt();
		int n = sc.nextInt();
		isTwins(m, n);
		sc.close();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值