这道题目要求我们找出所有小于等于给定正整数n的"与7无关的数",并计算它们的平方和。首先我们需要明确什么是"与7无关的数":
根据题意,一个数如果满足以下任一条件,就是"与7相关的数":
反之,不满足以上任何条件的数就是"与7无关的数"。
举个例子,当n=21时:
最直观的解法就是遍历1到n的所有整数,对每个数检查是否"与7无关",如果是则累加其平方。具体步骤如下:
这种解法的时间复杂度是O(n),对于题目给定的n<100的范围来说完全足够。
虽然对于n<100的情况暴力解法已经足够高效,但我们可以思考一下如果n很大时的优化方法:
不过对于n<100的情况,这种优化反而会增加代码复杂度,得不偿失。
cpp复制#include<iostream>
using namespace std;
int main() {
long n;
while(cin >> n) {
long sum = 0;
for(long i = 1; i <= n; i++) {
if(i % 7 != 0 && i % 10 != 7 && i / 10 != 7) {
sum += (i * i);
}
}
cout << sum << endl;
}
return 0;
}
#include<iostream>:包含标准输入输出库using namespace std;:使用标准命名空间long n;:定义长整型变量n存储输入while(cin >> n):循环读取输入直到EOFlong sum = 0;:初始化平方和为0for(long i = 1; i <= n; i++):遍历1到n的所有整数if(i % 7 != 0 && i % 10 != 7 && i / 10 != 7):检查是否与7无关
i % 7 != 0:不能被7整除i % 10 != 7:个位不是7i / 10 != 7:十位不是7sum += (i * i);:满足条件则累加平方cout << sum << endl;:输出结果虽然题目保证0<n<100,但好的编程习惯应该考虑边界情况:
为了验证代码的正确性,我们可以设计几个测试用例:
| 输入 | 预期输出 | 说明 |
|---|---|---|
| 1 | 1 | 最小输入 |
| 6 | 91 | 1²+...+6² |
| 7 | 91 | 排除7 |
| 10 | 385 | 排除7 |
| 17 | 1572 | 排除7,14,17 |
| 21 | 2336 | 题目样例 |
| 70 | 65306 | 排除7的倍数和70-79 |
提示:在编程竞赛中,自己设计测试用例验证代码是很好的习惯,可以避免边界条件错误。
虽然题目很简单,但我们可以思考一些相关问题:
如果n的范围扩大到1e6,如何优化?
如果条件改为与k无关的数(k不一定是7),如何设计通用解法?
如果要求的是立方和或更高次幂的和,解法是否变化?
这类问题虽然简单,但在实际中有一些应用场景:
初学者在解决这个问题时容易犯以下错误:
条件判断不完整:
整数溢出:
边界条件处理不当:
输入输出格式:
cpp复制#include<iostream>
using namespace std;
bool isRelatedTo7(int num) {
if(num % 7 == 0) return true;
while(num > 0) {
if(num % 10 == 7) return true;
num /= 10;
}
return false;
}
int main() {
int n;
while(cin >> n) {
long sum = 0;
for(int i = 1; i <= n; i++) {
if(!isRelatedTo7(i)) {
sum += i * i;
}
}
cout << sum << endl;
}
return 0;
}
原代码只能检查个位和十位,这个版本可以检查任意位:
cpp复制bool isRelatedTo7(int num) {
if(num % 7 == 0) return true;
while(num > 0) {
if(num % 10 == 7) return true;
num /= 10;
}
return false;
}
python复制while True:
try:
n = int(input())
total = sum(i*i for i in range(1, n+1)
if i % 7 != 0 and '7' not in str(i))
print(total)
except EOFError:
break
这道题目虽然简单,但很好地训练了基础的编程能力和问题分析能力。在实际编程中,我有以下几点体会:
对于编程初学者,建议从这类基础题目开始,逐步培养编程思维和习惯。在解决后,可以思考如何优化和扩展,这样进步会更快。