private long temp(long n){ //平方根 long len = (long)Math.sqrt(n); //先使用n视图拼出正方形 /** * (len-1)个 2火柴,一个4火柴,这是一列,共有len个这样的列 */ long res = len*(4+(len-1)*2); //还需要多少个 long other = n-len*len; if(other==0)return res; if(other<=len){ //只够补一行/列 res+=3+(other-1)*2; }else { res+=3+(len-1)*2;//补一行 other-=len; res+=3+(other-1)*2;//补一列 } return res; } 我解释一下帖主第三题的几行代码:long len = (long)Math.sqrt(n);先视图用用n个小正方行拼出最大程度的大正方形,所以开方。long res = len*(4+(len-1)*2); 在纸上画一下,len-1个“直角火柴”(2),一矩形火柴(4),组成一列,共有len个这样的列,而且(4)重合的部分会补上最后的边。long other = n-len*len; 统计还剩下几个(最多能够拼出一个完整的行或者列)。res+=3+(other-1)*2;剩下的小方块数量够填充多长的列/行。
点赞 1

相关推荐

牛客网
牛客企业服务