51Nod ----1009 数字1的数量
基准时间限制:1 秒 空间限制:131072 KB
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5
思路:
可以从数字中找关系。例如:n = 1234时,个位上的1有多少个?答案很显然是124个。
因为每10个数就有一个个位1,则1234/10= 123 而明显1231也有个位1,所以是124个。
那么十位1呢?答案是130个。同样我们可以分析出100个数里有10个十位1,则很容易算出130。
那么我们推广开来发现每个位上的1的数量受其高位,当前位和低位的影响。大家可能一想觉的
这不都屁话吗?高位+当前位+低位不就是n吗?——确实,不过这种拆开的思路很重要。
代码:
#include <iostream>
using namespace std;
typedef long long ll;
ll QO(ll N){
ll sum = 0;
ll now,high,low;
ll i = 1;
while(N/i){
now = (N%(i*10))/i;
high = N/(i*10);
low = N - (N/i)*i;
if(now > 1)sum += (high+1)*i;
else if(now == 1)sum += high*i + low+1;
else if(now == 0)sum += high*i;
i *= 10;
}
return sum;
}
int main(){
ll N;
cin>>N;
cout<<QO(N)<<endl;
return 0;
}