1. 程式人生 > >51NOD 1009 數字1的數量

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

解析:

       假設N,我們要計算百位上出現1的次數,將由三部分決定:百位上的數字,百位以上的數字,百位一下的數字。


       如果百位上的數字為0,則百位上出現1的次數僅由更高位決定,比如12013,百位出現1的情況為100~199,1100~1199,2100~2199,…,11100~11199,共1200個。等於更高位數字乘以當前位數,即12 * 100。


       如果百位上的數字大於1,則百位上出現1的次數僅由更高位決定,比如12213,百位出現1的情況為100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300個。等於更高位數字加1乘以當前位數,即(12 + 1)*100。


        如果百位上的數字為1,則百位上出現1的次數不僅受更高位影響,還受低位影響。例如12113,受高位影響出現1的情況:100~199,1100~1199,2100~2199,…,11100~11199,共1200個,但它還受低位影響,出現1的情況是12100~12113,共114個,等於低位數字113+1。

程式碼如下:

#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<cctype>
#define N 509
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long LL;
const int mod = 1000000009;
const double eps = 1e-8;

int solve(int n)
{
    int i = 1, l, cur, r, ans = 0;
    while(n / i != 0)
    {
        cur = (n / i) % 10;
        l = n / (i * 10);
        r = n - (n / i) * i;
        if(cur == 0) ans += l * i;
        else if(cur == 1) ans += l * i + r + 1;
        else ans += (l + 1) * i;
        i *= 10;
    }
    return ans;    
}


int main()
{
    int n;
    scanf("%d", &n);
    printf("%d\n", solve(n));
    return 0;
}