PAT A 1049 Counting Ones (30 分)

本文介绍了一种计算三位数中数字1出现次数的算法。通过分析不同情况下个位数1的出现频率,归纳出计算公式,并提供C++实现代码。适用于编程初学者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、思路

逐位计算‘1’的个数:

设三位数为3x6, 百位数为‘3’, 十位数为‘x’, 个位数为‘6’
则此时有三种情况:

1、x为0时:个位上出现30个‘1’: 分别是百位为0 ~ 2时的010 ~ 019、 110 ~ 019、 210 ~ 219,即3 * 10;

2、x大于1时,个位上出现40个‘1’: 010 ~ 019、 110 ~ 019、 210 ~ 219,以及百位为3时的310 ~ 319,即(3 + 1) * 10;

3、x为1时:个位出现37个‘1’: 分别是百位为0 ~ 2时的010 ~ 019、 110 ~ 019、 210 ~ 219,以及百位为3时的310 ~ 316,即3 * 10 + 16 + 1;

因此归纳:
		//设N为某数;
        n = N % ( place * 10 ) / place;//n为N的某位数;
        h = N / place / 10;//h为N中n的高位数
        l = N % place;//l为N中n的低位数
        if( !n )//n为0时;
            cnt = h * place;
        else if( n > 1 )//n>1时;
            cnt = (h + 1) * place;
        else cnt = h * place + l + 1;//n为1时;

二、代码

#include <cstdio>
int main()
{
    int N, sum = 0;
    scanf("%d", &N);
    for( int d = 1, n, h, l; N / d; d *= 10 )
    {
        n = N % ( d * 10 ) / d;
        h = N / d / 10;
        l = N % d;
        if( !n )
            sum += h * d;
        else if( n > 1 )
            sum += (h + 1) * d;
        else sum += h * d + l + 1;
    }
    printf("%d", sum);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值