/**
给定一个数计算其以内1出现的次数设为k,那么k = 个位1出现的次数 + 十位1出现的次数 + 百位1出现的次数······
那么:例如:123,如果要推断个位1出现的次数,它与高位和低位有什么关系呢?如果个位数为0,那么这个数以内个位出现1的次数只与他的高位有关,
等于高位数,如果个位数字等于1那么个位出现1的次数既与高位有关也与低位有关,等于高位数加上低位数再加上1;
如果低位数大于1,那么个位1出现的次数与只高位有关,等于高位数;
现在以一个数的任意一位,计算该数位1出现的次数,设该为所在的位数为factor,高位数为higer,低位数为lower,则有:
如果该数位数值等于0,那么这个数以内中该数位1出现的次数,它只与他的高位有关,等于higer * factor;
如果该数位数值等于1,那么这个数以内中该数位1出现的次数,它既与高位有关,也与低位有关,等于:higer * factor + lower + 1;
如果该数位数值大于1,那么这个数以内中该数位1出现的次数,它与高位有关,也与本身所在的数位有关,等于:higer * factor + factor
可以用一个简单的数推一下
*/
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int CountOnes( int n , int kcount)
{
int higernum, lowernum, curnum;
int factor = 1;
while(n/factor)
{
higernum = n / (factor * 10);
lowernum = n - (n/factor)*factor;
curnum = (n/factor)%10;
switch(curnum)
{
case 0:
kcount += higernum * factor;
break;
case 1:
kcount += higernum * factor + lowernum + 1;
break;
default:
kcount += higernum * factor + factor;
}
factor *= 10;
}
return kcount;
}
int main()
{
int n;
int kcount = 0;
int ans = 0;
while(~scanf("%d", &n))
{
ans = CountOnes( n, kcount );
printf("%d\n", ans);
}
return 0;
}
1049. Counting Ones (30)
最新推荐文章于 2019-08-23 07:28:26 发布