解密2025数字密码:数位统计之谜

#include <stdio.h>
int check(int n)
{
int c0 = 0;
int c2 = 0;
int c5 = 0;
while(n > 0)
{
int d = n % 10;
if(d == 0) c0 ++;
if(d == 2) c2 ++;
if(d == 5) c5 ++;
n /= 10;
}
if(c0 >= 1 && c2 >=2 && c5 >= 1) return 1;
return 0;
}
int main()
{
int n = 20250412;
int ans = 0;
for(int i = 1;i<=n;i++)
{
if(check(i)) ans ++;
}
printf("%d\n",ans);
return 0;
}

这段代码是在解决一个数位统计问题。简单来说,它的任务是找出 1 到 20250412 之间,所有包含"至少一个 0、两个 2、一个 5"的数字,并统计它们的总数量。

🎯 核心目标与逻辑

这段代码的数学逻辑基于题目提示:

一个数如果能通过重新排列得到"2025",那么它必须包含组成"2025"的所有原材料,即:

  • 至少 1 个数字 0
  • 至少 2 个数字 2
  • 至少 1 个数字 5

⚙️ 函数模块:check(int n)

这个函数是代码的"质检员",负责检查每一个数字是否合格。

详细解析:

  • 初始化 :每次检查新数字时,计数器**c0c2c5** 都必须从 0 开始。
  • while(n > 0):这是一个经典的数位拆解算法
    • 假设输入 n = 2025
    • 第 1 轮:d 是 5,c5 变为 1,n 变为 202。
    • 第 2 轮:d 是 2,c2 变为 1,n 变为 20。
    • 第 3 轮:d 是 0,c0 变为 1,n 变为 2。
    • 第 4 轮:d 是 2,c2 变为 2,n 变为 0(循环结束)。
  • 判定 :最后检查 c0 是否 ≥1≥1 ,c2 是否 ≥2≥2 ,c5 是否 ≥1≥1 。只有全满足才返回 1。

🔄 主程序模块:main()

主函数负责"流水线"工作:遍历所有数字,并调用 check 函数进行筛选。

详细解析:

  • for(int i = 1; i <= n; i++)
    • 这是一个暴力穷举法。程序会从 1 开始,一个一个地数,直到 20250412。
    • 注意 :这里的循环次数超过 2000 万次
  • if(check(i))
    • 程序把当前的数字 i 扔进 check 函数里"过安检"。
    • 如果 check 返回 1(代表合格),ans 就加 1。
    • 如果 check 返回 0(代表不合格),什么都不做,继续检查下一个数。

📌 总结

这段代码就是一个**"暴力筛选器"**:它不玩任何数学捷径,而是老老实实地把 1 到 20250412 之间的每一个数都拆开来看,数一数里面有几个 0、2、5,符合要求的就留下来计数。

相关推荐
aaaameliaaa36 分钟前
指针之总结
c语言·笔记·算法
宵时待雨1 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
agathakuan1 小时前
Wireshark 解密並導出TLS 1.2 / TLS 1.3 明文的方法(可控制 Client 端)
c语言·wireshark·ssl·openwrt
noipp1 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238562 小时前
C/C++每日一练6
c语言·c++·算法
wdfk_prog2 小时前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式
AI小码2 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
时间的拾荒人3 小时前
MySQL C语言连接 - 从入门到实战
android·c语言·mysql
KaMeidebaby3 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法