51nod 1009 数字1的数量
给定一个十进制正整数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
#include<bits/stdc++.h> using namespace std; int dp[15]; void init() { dp[0] = 0; for(int i=1;i<=9;i++) dp[i] = 10*dp[i-1] + pow(10,i-1);////预处理每位数中1的个数,例如i=3,就是1~999中含有1的个数 } int Count(int n) { int res=0,len=0,tail=0,radix=1,digit=0; while (n) { digit = n%10; n/=10; len++; if( digit > 1) res += radix+digit * dp[len-1]; //radix表示10^(len-1),例如len=3,就会有100~199这些数要计算,前导的1会产生radix个 else if(digit == 1) { res += tail + 1 + dp[len-1];//tali表示dight后面的数 } tail += digit *radix; radix *= 10; } return res; } int main () { init(); int n; scanf("%d",&n); printf("%d\n",Count(n)); }