列表

详情


OR148. 好奇的薯队长

描述

薯队长在平时工作中需要经常跟数字打交道,某一天薯队长收到了一个满是数字的表格,薯队长注意到这些数字里边很多数字都包含1,比如101里边包含两个1,616里包含一个1。
请你设计一个程序帮薯队长计算任意一个正整数n(0<n<=2147483647),从1到n(包括n)的所有整数数字里含有多少个1。

输入描述

正整数n(0<n<=2147483647)

输出描述

从1到n(包括n)的所有整数数字里含有多少个1

示例1

输入:

1

输出:

1

示例2

输入:

13

输出:

6

说明:

从1到13(包括13)有13个数字,其中包含1的数字有1,10,11,12,13,这些数字里分别有1,1,2,1,1个1,所以从1到13(包括13)的整数数字中一共有1+1+2+1+1=6个1

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-07

#include<bits/stdc++.h>
using namespace std;
int main()
{
        int n;
        cin>>n;
        long ans = 0;
        int left, right = 0, idx = 0, cur = 0;
        while(n)
        {
            cur = n % 10;
            left = n/10;
            if(cur == 0){
                ans += left*pow(10, idx);
            }else if(cur == 1){
                ans += left*pow(10, idx) + right + 1;
            }else{
                ans += (left + 1)*pow(10, idx);
            }
            right += cur*pow(10, idx);
            n /= 10;
            idx ++;
        }
    cout<<ans;
        return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2022-04-01

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

int dd[11] = {0};
int ddd[11] = {0};

int main() {
    int n;
    scanf("%d", &n);
    if (n < 10) {
        printf("1");
        return 0;
    }
    dd[1] = 1;
    ddd[0] = 1; //10 ^ 0;
    int base = 1;
    for (int i = 1; i < 10; i++) {
        dd[i] = i * base;
        base *= 10;
        ddd[i] = base;
        //printf("%d\n",dd[i]);
    }
    int c = 1;
    int h = 0;
    int hs[11] = {0};
    hs[0] = n % 10;
    int t = n / 10;

    while (t > 0) {
        hs[c] = t % 10;
        t = t / 10;
        c++;
    }
    long res = 0;
    for (int j = c - 1; j >= 0; j--) {
        int tmp = hs[j];
        //printf("%d-%d\n",tmp,j);
        for (int k = 0; k < tmp; k++) {
            res += dd[j];
            if (k == 1) {
                res += ddd[j];

            }
        }
        //printf("res=-%d\n",res);
        if (tmp == 1) {
            int t = 0;
            //printf("%d-%d\n",t,j);
            for (int m = j - 1; m >= 0; m--) {
                t = t * 10 + hs[m];
            }
            //printf("t===%d\n",t);
            res += t + 1;
        }
    }
    //printf("%d,%d",c,res + 1);
    printf("%ld", res);
}

上一题