yangyang12138

导航

求从10到100之间能被3和10整除的数的和

先说常规算法

function sum(n,m){
s = 0;
for(i=n;i<=m;i++){
if(i%3==0)s+=i;
if(i%5==0)s+=i;
}
return s;
}
参数传10和100 结果是2710 没什么可解释的,很容易理解,但是有循环计算肯定耗时

第二种办法
用3或5去乘以一个整数i,如果这个结果在 n,m 之间,则3i必然在n,m之间且可以被3整除,
根据上述条件 我们只要找出 一个序列 这个序列(min,……max)满足 max*3<m&&(max+1)*3>m  min*3>n&&(min-1)*3<n,

然后min-max之间累加和 乘以三 就是n,m之间所有能整除3的数的和

也就是说第一个任务是找出 max和min
既然min是大于n且是3的整数倍的最小数,那么必然满足  (n/3-min)<1

由此得出 min=parseInt((n+3-1)/3)

同理 max=parseInt(m/3)

第二步 计算 n-m之间累加和
第三步 乘以三得出结果
看代码

//计算整数s到整数e之间的累加和,利用的等差数列求和公司 (n+1)*n/2
function ss(s,e){
    var tem = 0;

    if(s==2)tem=1;
    if(s>2)tem=(s-1)*(s)/2;
    return e*(e+1)/2 - tem;
}

function sumEx(n,m){
    return ss(parseInt(n/3)+1,parseInt(m/3))*3+ss(parseInt(n/5)+1,parseInt(m/5))*5;
}

结果与前者相同,但是循环没有了,复杂度大大降低

posted on 2017-08-03 18:36  杨杨09265  阅读(240)  评论(0)    收藏  举报