import java.util.HashMap;
import java.util.Map;
public class AaddBandAmutiplyB {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Integer, Integer> SumDatas=new HashMap<>();
Map<Integer, Integer> MulDatas=new HashMap<>();
int tempsum;
//和个数
for (int i = 1; i < 21; i++) {
for (int j = i+1; j < 21; j++) {
tempsum=i+j;
if(SumDatas.containsKey(tempsum)) {
SumDatas.put(tempsum, SumDatas.get(tempsum)+1);
}else {
SumDatas.put(tempsum, 1);
}
}
}
//乘积个数
for (int i = 1; i < 21; i++) {
for (int j = i+1; j < 21; j++) {
tempsum=i*j;
if(MulDatas.containsKey(tempsum)) {
MulDatas.put(tempsum, MulDatas.get(tempsum)+1);
}else {
MulDatas.put(tempsum, 1);
}
}
}
//B->A
/*
* A明白手中数的组合中当且仅有一对组合的积有多个组合
* */
int count1=0;
for(Integer key : SumDatas.keySet()) {
int target=SumDatas.get(key);
//A不知道
if(target > 1) {
for (int i = 1; i < key / 2 + 1; i++) {
if(key-i > i && key-i < 21) {
int mul=(key-i)*i;
if(MulDatas.get(mul) > 1) {
count1++;
}
}
}
//因为A知道了,所以在A手中的数下面应当当且仅有一对组合数的积有多个组合
if(count1==1) {
//找出为一对,他们的积有多个组合的那个
for (int i = 1; i < key / 2 + 1; i++) {
if(key-i > i && key-i < 21) {
int mul=(key-i)*i;
if(MulDatas.get(mul) > 1) {
System.out.println(i + "和" + (key-i));
}
}
}
}
}
count1=0;
}
}
}
结果: