网易2018前端实习生编程题 JS

题目:
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。

但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。

解析:
一开始直接两个循环,结果代码复杂度太高了,运行超时。然后就开始冥思苦想找规律,也没找着,最后还是借鉴的别人的思路。

比较难理解的就是这两句代码:

count += Math.floor(n/y)*(y-k);
count += n%y-k+1;

首先,y的取值是从k+1到n的。从y到n一共有多少个数呢?我们可以这么想,n个数可以划分为长度为y的若干段。[1,y] , [y+1,2y] , [2y+1,3y] ……[my,n]。前面的m段的长度都是y,后面的长度为n个数处以y的余数n%y。
m为多少呢?n/y向下取整。
其中,每一段又有k个数是小于等于k的,也就是相除余数小于等于k。那么大于等于k的就是y-k。所以前面的m段中有Math.floor(n/y)*(y-k)对数。

最后一段比较特殊,当他的长度小于k时,不用说,除以k余数肯定小于k。所以余数大于k的就n%y-k+1。

var arr = readline().split(' ');
var n = parseInt(arr[0]);
var k = parseInt(arr[1]);
count = 0;
function main(n,k){
    if(k===0){
        count=n*n;
    }else{
        for(var y=k+1;y<=n;y++){
            count += Math.floor(n/y)*(y-k);
            if(n%y >=k){
                count += n%y-k+1;
            }
        }
    } 
    print(count);
}
main(n,k);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值