问题描述
给定搜索范围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();
}
}