[问题描述]
孪生数定义:如果A的质因数之和等于B,B的质因数之和等于A,A和B称为孪生数(A和B不相等)。试找出正整数M和N之间的所有孪生数。
[输入形式]
从控制台输入两个正整数M和N (1=M<N<=20000),中间用一个空分隔。
[输出形式]
在标准输出上输出符合题目描述的M和N之间的全部孪生数对(包活M和N)。每行输出一对孪生数,用一个空格隔开,小的先输出,各行孪生数按照第一个数从小到大的顺序输出,一对孪生数只输出一次。如果没有符合要求的孪生数对,则输出字符串"NONE"。
[输入样例1]
3 23
[输出样例1]
3 9
4 8
4 16
5 6
5 12
5 18
6 12
6 18
7 10
7 20
8 16
10 20
12 18
13 22
C++代码如下(大佬勿喷):
#include<bits/stdc++.h>
using namespace std;
int check(int x)
{
int i;
for(i=2;i<x;i++)
{
if(x%i==0)
return 0;
}
return 1;
}//判断yes or no素数
int main()
{
int m,n,flag=0;
cin>>m>>n;
for(int i=m;i<=n;i++)
{
int suma=0;
for(int j=1;j<=i;j++)
{
if(i%j==0&&check(j))
{
suma+=j;
}
}
int k;
for(k=i+1;k<=n;k++)
{
int sumb=0;
for(int j=1;j<=k;j++)
{
if(k%j==0&&check(j))
{
sumb+=j;
}
}
if(sumb==suma)
{
flag=1;
cout<<i<<" "<<k<<endl;
}
}
}
if(flag==0) cout<<"NONE";
return 0;
}
Java参考代码:
import java.util.Scanner;
public class Main {
public static boolean isPrime(int n) {
if(n==1||n==0) return false;
for(int i=2;i<=Math.sqrt(n);i++) {
if(n%i==0) return false;
}
return true;
}
public static int sum(int num) {
int s=0;
for(int i=2;i<=num;i++) {
if(num%i==0&&isPrime(i)) s+=i;
}
return s;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int flag=0;
for(int i=m;i<=n;i++) {
for(int j=m;j<=n;j++) {
if(sum(i)==sum(j)&&i<j) {flag=1;System.out.println(i+" "+j);}
}
}
if(flag==0) System.out.println("NONE");
scanner.close();
}
}