题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

/*
计算数字每一位出现1的次数,并相加,得到该数字中1出现的次数。
 
例如:1304中,个位出现1的次数,是131次,即1304/10 + 1 = 131;十位出现1的次数 (1304/100)*10  = 130;百位出现1的次数 (1304/1000 + 1)*100 = 200 ;千位出现1的次数( 1304/10000)*1000+1+1304-int(1304/1000)*1000 = 305 总计766;
 
总结一下,计算数字n中1的个数,得到以下规律:从个位开始,对每一位数字进行处理,先计算对10取余的余数rem,计算除以10以后的数字tmp,如果余数为0,则该位为1的数字个数为 base*tmp ;余数为1,该位为1的数字个数为n-int(n/base)*base +1 + tmp*base;base在每计算完一位数字后,乘以10,代码如下:
*/
 
#include <stdio.h>
 
void swap(int *a, int *b)
{
    int tmp = *b;
    *b = *a ;
    *a = tmp;
}
int getNum1(int n)
{
    int num =0;
     
    int tmp,rem,base;
    base =1;tmp = n;
     
    while(tmp)
    {
        rem = tmp%10;
        tmp = tmp/10;
        if(rem == 0)
        {
            num+=base*tmp;
        }
        else if(rem == 1)
        {
            num  = num + (n - int(n/base)*base +1 + tmp*base);
        }
        else
            num += (tmp+1)*base;
        base *= 10;
    }
     
    return num;
}
int main()
{
    int low ,high;
    while(scanf("%d%d",&low,&high)!=EOF)
    {
        if(low <0 || high <0)
            continue;
        if(low > high)
            swap(&low,&high);
        if(low ==0)
        {
            printf("%d\n",getNum1(high));
            continue;
        }
        printf("%d\n",(getNum1(high)- getNum1(low-1)));
    }
     
     
     
    return 0;
}
/**************************************************************
    Problem: 1373
    User: cust123
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1020 kb
****************************************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值