距离的总和(搜狗2017秋招真题)

题目描述定义两个大于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;
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值