博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题32:从1到n整数中1出现的次数
阅读量:5295 次
发布时间:2019-06-14

本文共 1221 字,大约阅读时间需要 4 分钟。

题目描述

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12, 1一共出现了5次。

题目分析

剑指Offer(纪念版)P174

代码实现

int NumberOf1Between1AndN_Solution2(int n){    if(n <= 0)        return 0;    char strN[50];    sprintf(strN, "%d", n);    return NumberOf1(strN);}int NumberOf1(const char* strN){    if(!strN || *strN < '0' || *strN > '9' || *strN == '\0')        return 0;    int first = *strN - '0';    unsigned int length = static_cast
(strlen(strN)); if(length == 1 && first == 0) return 0; if(length == 1 && first > 0) return 1; // 假设strN是"21345" // numFirstDigit是数字10000-19999的第一个位中1的数目 int numFirstDigit = 0; if(first > 1) numFirstDigit = PowerBase10(length - 1); else if(first == 1) numFirstDigit = atoi(strN + 1) + 1; // numOtherDigits是01346-21345除了第一位之外的数位中1的数目 int numOtherDigits = first * (length - 1) * PowerBase10(length - 2); // numRecursive是1-1345中1的数目 int numRecursive = NumberOf1(strN + 1); return numFirstDigit + numOtherDigits + numRecursive;}int PowerBase10(unsigned int n){ int result = 1; for(unsigned int i = 0; i < n; ++ i) result *= 10; return result;}

  

转载于:https://www.cnblogs.com/xwz0528/p/4864351.html

你可能感兴趣的文章
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
软件测试(基础理论一)摘
查看>>
consonant combination
查看>>
基于Flutter实现的仿开眼视频App
查看>>
析构器
查看>>
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
https通讯流程
查看>>
Swagger简单介绍
查看>>
C# 连接SQLServer数据库自动生成model类代码
查看>>
关于数据库分布式架构的一些想法。
查看>>
大白话讲解 BitSet
查看>>
sql语句中where与having的区别
查看>>
Python数据分析入门案例
查看>>
0x7fffffff的意思
查看>>
Java的值传递和引用传递
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>