给定一个十进制正整数n(1≤n≤10000),写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。 例如当n=2时,写下1,2。这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12。这样出现了5个“1”。
时间: 2023-05-31 13:01:58 浏览: 395
解题思路:
对于一个数n,如果我们要计算其中1的个数,我们可以统计它的每一位上1的个数,然后把它们相加即可。
以n=1234为例,我们先考虑个位上1的个数,因为个位上的数字为4,所以它的个位上1的个数为1。接下来我们考虑十位上1的个数,因为十位上的数字为3,所以它的十位上1的个数为10(因为10-19中十位上都是3,所以有10个1)。同理,百位上1的个数为100(因为100-199中百位上都是1,所以有100个1),千位上1的个数为1000(因为1000-1999中千位上都是1,所以有1000个1)。最后把它们相加,1的个数为1111。
具体地,我们可以使用一个变量ans来记录1的个数。对于每一位上的数字,我们将当前位上的数字分为三部分:
1. 大于1的部分:对于当前位以上的数字,我们可以将其看作是一个n-1位的数,它可以取到的最大值为999...9,所以它们每一位上都可以取到1-9,共有9×(n-1)个1。
2. 等于1的部分:对于当前位上的数字为1的情况,它的贡献为当前位以下的数字加1,即如果当前位以下的数字为xyz,那么它可以取到的值为000...0~xyz,共有xyz+1个1。
3. 小于1的部分:对于当前位上的数字小于1的情况,它的贡献为0。
最后把它们加起来即可。
时间复杂度:O(logn)
完整代码:
相关问题
2: :数1的个数 【题目描述】 给定一个十进制正整数n(1≤n≤10000),写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。 例如当n=2时,写下1,2。这样只出现了1个“1”; 当n=12时,写下1,2,3,4,5,6
,7,8,9,10,11,12。这样出现了5个“1”。请你编写一个程序,计算出从1到n的所有整数中,数字“1”出现的个数。
【输入格式】
输入一个整数n。
【输出格式】
输出一个整数,表示从1到n的所有整数中,数字“1”出现的个数。
【样例输入】
12
【样例输出】
5
【样例说明】
从1到12的所有整数中,数字“1”出现的个数为5,分别是1,10,11,12中的“1”。
用C语言编写 给定一个十进制正整数n,写下从一到n的所有整数,然后数一下,其中出现的数字一的个数
在C语言中,你可以使用循环结构(for或while)来遍历1到n的整数,并通过计数器来记录数字1出现的次数。下面是一个简单的示例代码:
```c
#include <stdio.h>
int main() {
int n, count = 0; // 定义整数n和用于计数的一
printf("请输入一个正整数n: ");
scanf("%d", &n); // 输入用户提供的值
for (int i = 1; i <= n; i++) { // 遍历1到n
if (i == 1) { // 当当前数字等于1时,计数加一
count++;
}
printf("%d ", i); // 输出每个数字
}
printf("\n在1到%d的数字中,数字1出现了 %d 次。\n", n, count);
return 0;
}
```
在这个程序中,我们首先读取用户的输入`n`,然后使用for循环迭代1到n的所有整数。如果当前数字`i`等于1,就增加计数器`count`。最后输出结果并显示数字1出现的次数。
阅读全文