PAT--1049. Counting Ones

The task is simple: given any positive integer N, you are supposed to count the total number of 1’s in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1’s in 1, 10, 11, and 12.

Input Specification:

Each input file contains one test case which gives the positive N (<=230).

Output Specification:

For each test case, print the number of 1’s in one line.

Sample Input:

12

Sample Output:

5

题解

显然,暴力~不可取,但可以用来对拍。
对于1~n这n个数,要知道数字1出现的次数,可以计算出个位、十位、百位…这些数位上1出现的次数,累加起来即可。
个位:0~9的循环,即0123456789,一次循环只有1个1
十位:0~9的循环,每个数连续出现10次, 即000000000111111111….一次循环有10个1
百位:0~9的循环,每个数连续出现100次,….一次循环有100个1

规律性是很显然的。

#include <bits/stdc++.h>
using namespace std;

int n, sum;

int length(int n){
    int ret = 0;
    while(n){
        ret++;
        n /= 10;
    }
    return ret;
}


int main(){
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif

    cin >> n;
    n++;

    int k = 10;
    int len = length(n);
    for(int i = 1; i < len; ++i){
        int a = (n / k * (k / 10));
        int b = (n % k > k / 10) ? (n % k < 2 * k / 10 ? (n % k - k / 10) % (k / 10) : k / 10) : 0;
        //cout << "a + b: " << a + b << endl;
        //cout << "b: " << b << endl;
        sum += a + b;
        k *= 10;
    }
    // 处理最高位
    int p = n / ((int)pow(10, len - 1));
    if(p == 1) sum += n % (int)pow(10, len - 1);
    else sum += pow(10, len - 1);

    cout << sum << endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8对集合框架进行了一些重大的改进,其中之一就是引入了流式API。在这个新的API中,提供了许多集合操作的新方式。其中一个新特性是groupingBy()方法,它可以根据指定的条件对集合中的元素进行分组。在groupingBy()方法中,可以使用counting()方法来计算每个分组中元素的数量。 在collectors.groupingby(e -> e, collectors.counting())的代码中,collectors是一个类型为Collectors的类。该类提供了用于收集流数据的许多方法,包括groupingBy()和counting()方法。在这个示例中,首先使用groupingBy()方法将元素按照它们自身的值进行分组。然后,使用counting()方法来计算每个分组中元素的数量。 具体而言,这段代码将会从一个流中收集数据。在每个分组中,相同值的元素将会被分到一起。例如,如果流中包含了如下元素:"A", "B", "B", "C", "C", "C"。那么此时使用groupingBy()方法后,将会产生如下的结果: {"A"=["A"], "B"=["B", "B"], "C"=["C", "C", "C"]} 我们可以看到,每个不同的值都被分配到了相应的分组中。然后,我们使用counting()方法来查找每个分组中元素的数量。在这种情况下,我们将会得到这样的结果: {"A"=1, "B"=2, "C"=3} 这里可以看到,每个分组中元素的数量已经被计算出来了。在这个案例中,我们可以看到有一些重复的元素值,但它们被放在一起并且计算了它们的数量。在任何需要对集合中的元素进行分组并计算相关数据的场景下,collectors.groupingby(e -> e, collectors.counting())都是一个非常有用的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值