编程入门:详解“与7无关的数”筛选与求和问题
这类编程练习题最值得先看的不是题目描述而是它到底在考察什么、新手容易在哪里卡住、以及怎么写出既正确又清晰的代码。“与7无关的数”是一个经典的入门级筛选与求和问题它考察的是对整数基本操作、条件判断和循环的掌握。很多初学者一看题目觉得简单但实际写起来可能在“与7无关”的条件理解、边界处理或者求和累加的逻辑上出岔子。这篇文章就从一个写过很多类似代码的角度拆解这道题让你不仅能做出答案更能理解这类问题的通用解决思路和避坑要点。1. 先拆解“与7无关”到底是什么意思题目通常这样描述一个正整数如果它能被7整除或者它的十进制表示法中某一位上的数字为7则称这个数为“与7有关”。反之则是“与7无关”。现在给定一个范围比如n 100求这个范围内所有“与7无关”的正整数的平方和。1.1 核心条件判断三个子条件必须全部不满足“与7无关”是“与7有关”的反面。所以我们的核心是判断一个数是否“与7有关”。如果一个数满足以下任意一个条件它就是有关的能被7整除即i % 7 0。个位是7即i % 10 7。十位是7即(i / 10) % 10 7。对于n100的情况十位就是i / 10。只有当这三个条件全部不满足时这个数才是“与7无关”的。很多新手会在这里逻辑混淆错误地用“且”去连接条件。记住判断“有关”用“或”判断“无关”则需要对“有关”的条件取反或者直接用“且”连接三个不满足的条件。1.2 为什么是“平方和”而不是简单求和题目要求的是平方和这增加了两个考察点计算需要在循环体内累加i * i而不是i。数据范围平方和增长很快。例如当n99时最大的无关数可能是96其平方为9216。100个这样的数平方和可能会超过int型变量的表示范围约21亿。因此使用long long类型来存储结果通常是更安全的选择这是一个非常实际的工程细节。1.3 输入范围与循环边界题目一般会给出一个上限n(1 n 100)。我们需要处理的是从1到n包括n的所有整数。循环的写法通常是for(int i 1; i n; i)。这里要注意是i n还是i n必须根据题意明确。对于“小于n”的描述就是i n。2. 从零开始的完整实现步骤与代码我们假设题目输入是一个整数n输出是1到n之间所有与7无关的正整数的平方和。下面我按实际写代码和测试的顺序一步步来。2.1 环境与框架准备你可以在任何支持C/C的环境里写这道题比如本地IDEVisual Studio, Code::Blocks, Dev-C等。在线编译器很多OJ在线判题系统都自带。命令行用g或clang编译。代码结构就是一个简单的控制台程序。我建议先在一个单独的.cpp文件里写方便编译和测试。2.2 第一种写法清晰的条件判断这是最直观的写法直接翻译题目逻辑。#include iostream using namespace std; int main() { int n; cin n; // 读入范围上限n long long sum 0; // 使用long long防止平方和溢出 for (int i 1; i n; i) { // 判断是否与7有关 bool related false; if (i % 7 0) { // 条件1能被7整除 related true; } else if (i % 10 7) { // 条件2个位是7 related true; } else if ((i / 10) % 10 7) { // 条件3十位是7 related true; } // 如果与7无关则累加其平方 if (!related) { sum (long long)i * i; // 注意这里也转为long long计算 } } cout sum endl; return 0; }为什么这么写用一个布尔变量related来标记逻辑清晰。使用else if是因为一旦确定有关就不需要再判断后续条件效率稍高。在累加时将i强制转换为long long再相乘是为了避免两个int相乘可能溢出虽然本题n100不太会但这是好习惯。2.3 第二种写法简化的条件表达式也可以将判断条件写在一个if语句里更紧凑。#include iostream using namespace std; int main() { int n; cin n; long long sum 0; for (int i 1; i n; i) { // 判断是否与7无关同时不满足三个条件 if ( (i % 7 ! 0) (i % 10 ! 7) ((i / 10) % 10 ! 7) ) { sum (long long)i * i; } } cout sum endl; return 0; }这种写法直接判断“无关”条件是用“且”连接的三个“不等于”。我个人更推荐新手先用第一种逻辑更直白熟练后可以用第二种代码更简洁。2.4 验证与测试自己当一回判题机写完代码不要直接提交先自己用几个例子验一下。测试用例设计小范围验证 (n10)与7有关的数7被7整除。与7无关的数1, 2, 3, 4, 5, 6, 8, 9, 10。平方和 1491625366481100 336。运行程序输入10看输出是否为336。包含个位和十位是7的数 (n20)与7有关的数7, 14, 17。可以手动计算或信任程序。用你的程序跑一遍再心算几个关键数验证。边界测试 (n1, n6)n1时输出应为1。n6时输出应为14916253691。稍大的数 (n30)检查27个位是7不是十位2不是7个位是7等等27的个位是7所以27是有关的。这个例子能帮你确认条件判断是否正确。在本地运行输入这些测试用例对比输出。如果都对了你的代码逻辑基本就稳了。3. 深入讨论如果n的范围扩大怎么办原题n100所以我们只检查了十位。这是一个重要的边界限制。如果题目没有明确限制n的范围或者n可以很大比如n10000那么“某一位上是7”这个条件就需要通用化处理。3.1 通用化的数字位检查算法我们不能只写死检查十位和个位。需要一个循环来分解整数的每一位。bool isRelatedToSeven(int num) { // 条件1能被7整除 if (num % 7 0) { return true; } // 条件2任何一位数字等于7 int temp num; while (temp 0) { if (temp % 10 7) { // 检查当前个位 return true; } temp / 10; // 去掉个位 } return false; // 两个条件都不满足则无关 }在主循环中调用这个函数for (int i 1; i n; i) { if (!isRelatedToSeven(i)) { sum (long long)i * i; } }为什么这样写更好可扩展性无论n是几位数算法都适用。清晰性将核心判断逻辑封装成函数主函数更简洁。可维护性如果判断规则变化只需修改这个函数。3.2 思考性能与优化对于n100两种方法性能无差异。但如果n极大例如上亿我们需要考虑提前终止上面的函数一旦发现某位是7就返回避免了不必要的循环。避免重复计算i * i可以计算一次存起来。数学方法本题可能存在更巧妙的数学规律来批量计算“无关数”的平方和但这超出了入门练习的范畴。对于算法题优先保证正确性和清晰性。注意在入门阶段不要过早追求极致的优化。先把逻辑写对、写清楚这是最重要的。4. 常见错误与排查清单很多同学提交代码后遇到“答案错误”、“运行超时”或“格式错误”问题往往出在细节上。下面是我总结的排查顺序4.1 答案错误Wrong Answer这是最常出现的。按以下顺序检查条件逻辑检查if语句的逻辑运算符。是“或”还是“且”判断“有关”还是“无关”最经典的错误就是把判断“无关”的条件(i%7!0 i%10!7 (i/10)%10!7)错写成(i%7!0 || i%10!7 || (i/10)%10!7)。循环边界确认是i n还是i n。仔细读题求和变量初始化sum是否初始化为0了未初始化的变量值随机会导致结果不可预测。整数溢出sum是否用了int当n较大时平方和很可能超过21亿。改成long long。中间计算溢出即使sum是long longi * i也可能是两个int相乘在赋值给sum前就已经溢出了。确保计算时类型足够大如sum (long long)i * i。输入输出格式题目要求输出后换行吗你的cout sum;后面有没有加 endl或\n4.2 运行超时Time Limit Exceeded本题n100几乎不可能超时。如果超时99%是代码陷入了死循环。检查循环变量在for循环里你是否错误地修改了循环变量i通用化算法检查如果你写了通用位检查的while循环确保循环条件(temp 0)正确并且循环体内有temp / 10来改变temp的值。4.3 格式错误Presentation Error通常是因为输出格式与题目要求不完全一致。多输出或少输出是否只输出了一个结果有没有多输出提示语句如“请输入n:”OJ只接受纯结果数据。空格与换行结果是单独一行吗末尾有换行符吗在大多数OJ中末尾有无换行符不影响判题但最好养成输出后换行的习惯 (cout sum endl;)。5. 举一反三同类问题的解决模式“与7无关的数”是一个代表有一类问题都可以用类似的模式解决。掌握这个模式你就能快速解决它们。5.1 问题模式识别这类问题的共性给定一个整数范围按照某种规则筛选出符合条件的数然后对它们进行某种运算求和、平方和、计数、求平均值等。规则可能包括数字特性某位是几、是回文数、是水仙花数、数字之和等。整除特性能被某个数整除、不能被某个数整除。组合条件像本题一样多个条件的组合。5.2 通用解决框架读入数据确定范围n有时可能是区间[a, b]。初始化结果变量根据运算是求和、计数还是其他初始化sum0,count0等。注意数据类型。遍历范围使用for循环遍历每个待检查的数i。条件判断编写一个函数或一段内联代码判断i是否满足条件。这是核心。如果判断逻辑复杂强烈建议封装成独立函数如bool check(int num)。判断时注意提取数字的各位通过%10和/10循环。累积结果如果满足条件就更新结果变量sum i*i,count。输出结果按格式要求输出。5.3 变式练习你可以用这个框架尝试解决以下问题巩固技能求水仙花数一个三位数其各位数字立方和等于该数本身。输出所有水仙花数。求素数之和求给定区间内所有素数的和。数字统计统计1到n中数字k0-9出现了多少次。特殊数的和求1到n中既能被3整除又能被5整除的数的和。解决这些问题时唯一需要变化的就是第4步的“条件判断”函数。遍历和累加的框架是完全一样的。6. 写给新手的最后几点建议我见过很多初学者在这类题目上反复出错不是因为算法难而是因为一些习惯没养成。第一先画流程图或写伪代码再敲键盘。尤其是条件判断部分用纸笔列出几个测试数如7, 14, 17, 27, 71手动走一遍你的判断逻辑。这能避免最致命的逻辑错误。第二重视测试。不要只相信样例输入输出。像第2.4节那样自己设计几个关键的、边界的测试用例。包括最小的n、最大的n、包含各种“有关”情况的n。自己当自己的第一道关卡。第三理解大于记忆。不要只背下这道题的代码。要理解“遍历-判断-累加”这个模式理解如何用%和/来获取数字的每一位。这样下次遇到“与5无关”或者“包含数字3”的题目你就能自己写出来。第四注意数据类型是基本功。int和long long的选择中间计算会不会溢出这些问题在简单题里可能不暴露但在复杂题目里就是致命的。从一开始就养成根据数据范围选择类型的习惯。这道题本身不难但它像一块很好的试金石能检验你对循环、条件、基本运算和整数处理是否真的掌握了。把它吃透这一类“数字筛选计算”题你就有了一个可靠的解题模板。

相关新闻

Turbo C++ 3.0汉化版完整配置与开发环境搭建实战

Turbo C++ 3.0汉化版完整配置与开发环境搭建实战

1. 项目概述:为什么今天还要折腾Turbo C 3.0?如果你是一位从90年代末或21世纪初开始接触编程的老兵,看到“Turbo C 3.0”这个名字,心里肯定会泛起一阵复杂的涟漪。它可能是你编程生涯的起点,那个在蓝底黄字的DOS界面里…

2026/10/12 15:05:26 阅读更多 →
音乐情感分析:技术拆解为何特定歌曲引发告别预感

音乐情感分析:技术拆解为何特定歌曲引发告别预感

最近在整理音乐项目时,发现一个有趣的现象:某些歌曲因其特定的创作背景、旋律走向或歌词意境,会让人产生超越歌曲本身的联想和情感共鸣。比如,有朋友提到,第一次听到某首新歌时,竟产生了“这不会是告别曲吧…

2026/10/12 15:05:00 阅读更多 →
CrewAI项目环境变量配置:告别API密钥硬编码的安全实践

CrewAI项目环境变量配置:告别API密钥硬编码的安全实践

1. 项目概述:为什么CrewAI项目必须告别硬编码风险?如果你正在用CrewAI搭建多智能体系统,或者正准备上手,那你肯定遇到过这个场景:在代码里直接写下了你的API密钥,比如api_key "sk-xxxx-your-secret-k…

2026/10/12 16:02:37 阅读更多 →

最新新闻

本地正则调试工具Rea:终端下的高效正则匹配与验证实践

本地正则调试工具Rea:终端下的高效正则匹配与验证实践

“Rea”这个名字听起来像个随手敲出来的占位符号,但它最终成了我的本地正则表达式调试工具的真名。做后端开发的这阵子,我发现自己最频繁的动作是打开某个在线正则测试网站,把一段日志解析规则粘进去,贴上一串样本数据&#xff0c…

2026/10/13 16:00:06 阅读更多 →
用CDP协议操控Electron:从坐标点击到浏览器级自动化

用CDP协议操控Electron:从坐标点击到浏览器级自动化

1. 桌面App自动化的视角转换:为什么我放弃坐标点击做桌面应用自动化的人,大概率都经历过这样一段弯路:拿到一个Electron应用,先想到用坐标点击、图像识别或者Windows UI Automation去抓控件。我在一个模拟项目里尝试用坐标点击操作…

2026/10/13 16:00:06 阅读更多 →
上下文管理实战:从分层裁剪到压缩排序,解决模型答非所问

上下文管理实战:从分层裁剪到压缩排序,解决模型答非所问

1. 上下文管理不是"记性好",而是"知道什么时候该忘"很多人第一次接触"上下文管理"这个词,是在做对话系统或者长文档处理的时候。一开始大家的直觉都是:上下文嘛,不就是把之前说过的话都带上&#x…

2026/10/13 16:00:06 阅读更多 →
圆板自由振动固有频率MATLAB计算与边界条件实现

圆板自由振动固有频率MATLAB计算与边界条件实现

简介:本资源是一套面向振动工程与结构动力学方向的MATLAB计算脚本,专为高校研究生、科研人员及力学仿真初学者设计,用于求解自由边界条件下圆板的固有频率与模态形状系数(λₘₙ和Cₘₙ),解决理论推导复杂、…

2026/10/13 16:00:06 阅读更多 →
基于遗传算法的热电联产选址定容Matlab实现与工程实践

基于遗传算法的热电联产选址定容Matlab实现与工程实践

做热电联产规划的人都知道,选址定容是前期最折磨人的一环:既要考虑热源靠近热负荷中心,又要兼顾电力并网和燃料供应;不仅要算当下投资,还要把几十年的运行成本折进来;更麻烦的是,候选站址和容量…

2026/10/13 16:00:06 阅读更多 →
基于JavaWeb的图书馆管理系统:从数据库设计到答辩全流程拆解

基于JavaWeb的图书馆管理系统:从数据库设计到答辩全流程拆解

每年我的邮箱和私信都会被同一个问题塞满:“老师,有没有现成的毕设项目?最好简单点、能跑通、好答辩。”今年那批600套毕设分享出来之后,我翻了一圈,发现图书馆管理系统仍然是出现频率最高的题目之一。说句实话&#x…

2026/10/13 15:59:05 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →