输入一个整数n(如果n<0,则n取0,如果n>1000,则n取1000),求1~5*n,这5*n个整数的十进制表示中1出现的次数。例如12的十进制表示中1出现的次数:1~12这些整数中包含1的1、10、11和12,1一共出现了5次。Java代码实现 高效点
时间: 2024-10-03 07:04:11 浏览: 27
在Java中,我们可以使用计数数组和位操作的方式来高效地计算1到5n这个范围内的1出现的次数。这里是一个简单的算法思路:
首先,我们创建一个大小为10的布尔数组`count[10]`,用于记录每个数字的最后一位是否为1。然后,我们将n限制在1到1000之间,并遍历从1到5n。
对于每个数i(1 <= i <= 5 * n),我们可以将i除以10并将余数存入`count`数组。这是因为每位上的1可以用整数除以10取余1得到。例如,i=12的最后一位是2,所以(i / 10) % 10 = 2,不在数组里,因此不需要更新。如果我们遇到的是1,则直接将对应的`count[1]`加一。
最后,我们需要将所有位上的1加起来,由于数组大小有限,所以我们需要将`count[1]`的结果乘以10并加上数组其他位置的值。
以下是Java代码实现:
```java
public int countOnes(int n) {
if (n < 0) n = 0;
else if (n > 1000) n = 1000;
int[] count = new int[10];
for (int i = 1; i <= 5 * n; i++) {
count[i % 10]++;
}
int result = count[1]; // 个位上的1
for (int i = 2; i <= 9; i++) {
result += count[i] * i; // 其他位上的1乘以相应位数相加
}
return result;
}
```
阅读全文