首页 / JAVA / Java在数字范围内计数一位
Java在数字范围内计数一位
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java在数字范围内计数一位,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1972字,纯文字阅读大概需要3分钟。
内容图文
![Java在数字范围内计数一位](/upload/InfoBanner/zyjiaocheng/659/9c6c771d04ba4e599bdbebab5ff2a8e4.jpg)
我在大范围内计数一位时遇到问题.
所以我必须在1到1000的eq数范围内计算一位
是4938.
public static long countRangeOneBits(long n){
long t = 0;
for (long i = 1; i <= n; i++) {
long x = i;
while (x > 0) {
t += x%2;
x /= 2;
}
}
return t;
}
好的,这工作正常,但我需要计算范围1..10 ^ 16.首先,java不会计算这么大的数字,至少对于长数据类型而言.我还有其他选择吗,或者你们对我应该如何解决此问题有任何提示.
| From 1 To | Total |
| 1 | 1 |
| 10 | 14 |
| 100 | 319 |
| 1000 | 4938 |
| 10000 | 64613 |
| 100000 | 815030 |
| 1000000 | 9884999 |
| 10000000 | 114434632 |
| 100000000 | 1314447116 |
| 1000000000 | 14846928141 |
| 100000000000000 | 2306412649693200 |
| 1000000000000000 |24784747400675300 |
解决方法:
我猜你需要玩2 ^ n.从0到(2 ^ n-1)的1位总数= n * 2 ^(n-1).
而在程序中,这就是您想要的
private static long getBits(long l){
if(l == 0){
return 0;
}else if(l == 1){
return 1;
}
boolean isPowerOf2Minus1 = (l & (l+1)) == 0;
long maxBitNum = Long.highestOneBit(isPowerOf2Minus1 ? l+1 : l);
int maxBit = Long.numberOfTrailingZeros(maxBitNum);
if((l & (l+1)) == 0){
return maxBit * (maxBitNum >> 1);
}
long diff = l - maxBitNum;
return diff + 1 + getBits(maxBitNum - 1) + getBits(diff);
}
结果如下
1 : 1
10 : 17
100 : 319
1000 : 4938
10000 : 64613
100000 : 815030
1000000 : 9884999
10000000 : 114434632
100000000 : 1314447116
1000000000 : 14846928141
10000000000 : 164293127179
100000000000 : 1809725656079
1000000000000 : 19809942118413
10000000000000 : 214309466746894
100000000000000 : 2306412649693201
1000000000000000 : 24784747400675348
10000000000000000 : 264286863212871700
100000000000000000 : 2804216299269586964
内容总结
以上是互联网集市为您收集整理的Java在数字范围内计数一位全部内容,希望文章能够帮你解决Java在数字范围内计数一位所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。