给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。
比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是1的两倍,4是2个两倍,18是9的两倍。
输入
输入包括多组测试数据。每组数据包括一行,给出2到15个两两不同且小于100的正整数。每一行最后一个数是0,表示这一行的结束后,这个数不属于那2到15个给定的正整数。输入的最后一行只包括一个整数-1,这行表示输入数据的结束,不用进行处理。
样例输入
1 4 3 2 9 7 18 22 0
2 4 8 10 0
7 5 11 13 1 3 0
-1
样例输出
3
2
0
输入的那个应该怎样写?
------最佳解决方案--------------------
稍微写了一个,很多地方没做限制,也没仔细测,不过楼主可以参考一下,呵呵!
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Demo1
{
public static void main(String[] args)
{
List<Integer> list = test();
for(int n : list)
{
System.out.println(n);
}
}
private static List<Integer> test()
{
Scanner scanner = new Scanner(System.in);
List<Integer> list = new ArrayList<Integer>();
List<Integer> res = new ArrayList<Integer>();
String str = null;
while(!"-1".equals(str = scanner.nextLine()))
{
Scanner sc = new Scanner(str);
while(sc.hasNext())
{
list.add(sc.nextInt());
}
res.add(calc(list));
list.clear();
sc.close();
}
scanner.close();
return res;
}
private static int calc(List<Integer> list)
{
int res = 0;
for(int i = 0; i < list.size(); i ++)
{
for(int j = 1; j < list.size(); j ++)
{
int ni = list.get(i);
int nj = list.get(j);
if(0 == ni)
continue;
if(0 == nj)
continue;
if(0 != nj % ni)
continue;
if(2 == nj / ni)
res ++;
}
}
return res;
}
}
运行结果:
------其他解决方案--------------------
1. 排序
2. 从头开始遍历,每个数乘以2得到值X,使用2分查找X是否在数组中
------其他解决方案--------------------
能不能用枚举来做?
------其他解决方案--------------------
明白了,这样更简单!谢