“两两”求和问题技巧
问题描述:
输出所有数两两之间距离的总和。
思路:
由于是两两,所以对于每2个相邻点之间的区间,会被统计(左边点的个数*右边点的个数)次。
比如:对于序列 2, 7, 9, 16, 20, 23, 30 中的9-16这个区间,左边有3种情况,右边有4种情况,所以总的有3*4=12种情况,即有12个区间会包含有9-16这个区间。
示例代码:
注意这一行代码:result += count*(i+1)*(n-i-1);
public class Main{
//快速判断一个数是不是质数:(总共2步)
//1、判断能否被2整除
//2、遍历 3~Math.sqrt(value)这个范围
public static boolean IsPrime(int val){
boolean flag = true;
if((val & 1) == 0){
flag = false;
return flag;
}
for(int i=3; i<= Math.sqrt(val); i+=2){
if(val%i == 0){
flag = false;
break;
}
}
return flag;
}
public static long MyFunction(int n, int[] nums){
long result = 0;
for(int i=0; i<n-1; i++){
int count = 0;
for(int j=nums[i]+1; j<nums[i+1]; j+=2){
if(IsPrime(j))
count++;
}
result += count*(i+1)*(n-i-1);
}
return result;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int n = in.nextInt();
int[] nums = new int[n];
for(int i=0; i<n; i++){
nums[i] = in.nextInt();
}
long result = MyFunction(n, nums);
System.out.println(result);
}
}
}
参考:
http://exercise.acmcoder.com/online/online_judge_list_all?konwledgeId=41