n范围数字内数字1的个数
原题在这里:
概述题意:求n范围内的数字中,数字1的个数。
analyse:
我起初做这个题的时候,也是考虑的从每一位数字上去分析这个位能给ans提供多少个1,但终究是太nen了,想得稀奇古怪,不过最后还是瞎捣鼓4小时以后还是ac了,虽然写得很混乱,人也没忍住我老是写错我想要的逻辑,写完连题解都不想看了,搁置了许多天。
分析学习在这里。
那是该想到的都想到了,就是实现的逻辑不同,人家纯纯数学带佬,我就不一样,瞎鼓捣,要不是有力扣可以无限提供样例,我多半不会写出来。
但是着实没办法(无能狂怒)
由于我的code非常乱,所以:

class Solution { string s; int l, len; int dfs(int x) { string p = s.substr(0, l - x); string q = s.substr(l - x + 1, x); int u = atoi(p.c_str()), v = atoi(q.c_str()); int sum = 0, tp = -1; if (x != 0 && x != l) { tp = u + (s[l - x] > '1'); sum += pow(10, x) * tp + (s[l - x] == '1' ? v + 1 : 0); } else { sum += u; if (l - x == 0) sum += s[l - x] > '1' ? pow(10, x) : v + 1; else sum += s[l - x] >= '1'; } if (x < l) return dfs(x + 1) + sum; else return sum; } public: int countDigitOne(int n) { s = to_string(n); l = s.length() - 1; if (!n) return 0; len = log10(n); return dfs(0); } };
一通分析下来的数学代码(int会被卡一下,所以得用long):
class Solution { public: int countDigitOne(int n) { int ans = 0; long i = 1, m = n; while (i <= m) { ans += (m / (i * 10)) * i + min(max(m % (i * 10) - i + 1, (long)0), i); i *= 10; } return ans; } };
【Over】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!