求从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; }
结果与前者相同,但是循环没有了,复杂度大大降低
浙公网安备 33010602011771号