题目描述定义两个大于2的偶数之间的距离,为这两个数之间质数的个数。从小到大输入n个大于2的偶数,输出所有数两两之间距离的总和(应该有n*(n-1)/2个距离,输出总和就好)。
输入
第一行是输入偶数的个数,最小为2,最大可能到几万。之后每行为一个偶数,最小是4,最大可能是几百万,不重复的升序排列。
输出
输入数据两两间距离的总和,这应该是一个不小于0的整数。
想法是先输入数字,然后遍历一遍这写数字,将两两相连数字间的距离用数组存起来,由于 i 到 i+1 数字间的距离被用了(i)*(n-i)次,于是将这个距离与次数乘起来求和即可。(ps. i 从1开始)
解释:第 i 个数字之前有(包括 i )i 个数字,第 i + 1之后有(包括 i+1)有 n-i 个数字,前面 i 个数字与后面 n-i 个数字任选两个组合,这个组合之间的间距都会包括 从 i 到 i+1 数字间的距离,即这段距离被累加了一次。所以一共是(i)*(n-i)次。
直接上代码:
bool judge(int n){
if(n < 2) return false;
if(n == 2) return true;
for(int i = 2;i <= sqrt(n);i++){
if(n%i==0) return false;
}
return true;
}
int main(int argc, const char * argv[]) {
int num;
cin>>num;
int a[num];
double res=0;
vector<int> r;
for(int i=0;i<num;i++){
cin>>a[i];
}
for (int i=0; i<num-1; i++) {
int cnt=0;
for(int j=a[i]+1;j<a[i+1];j++){
if(judge(j)) cnt++;
}
r.push_back(cnt);
}
for (int i=0;i<r.size();i++){
res += r[i] * (r.size()-i) * (i+1);
}
cout<<res<<endl;
return 0;
}