题目描述
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?
输入描述
输入格式:
输入一行包含两个整数 n(1≤n≤104)。
输出描述
输出一行,包含一个整数,表示满足条件的数的和。
输入输出样例
示例
输入
40
输出
574
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 19015 | 总提交次数: 19790 | 通过率: 96.1%
难度: 简单 标签: 2019, 暴力, 枚举, 省赛
解题过程
#include <iostream>
using namespace std;
int tmp(int a)
{int k=0,s=0;for(int j=a;j!=0;j=j/10){k=j%10;if(k==2||k==0||k==1||k==9){s++;}}return s;
}
int main()
{// 请在此输入您的代码int n;cin>>n;int sum=0,k=0;for(int i=1;i<=n;i++){if(tmp(i)!=0){sum=sum+i;}}cout<<sum;return 0;
}
注意事项
在编写这个代码过程中,我们应该注意的是,如何将一个数字的个、十、百、千等等拆分出来,进行判断,并且在判断的过程中如果一个数字的不同位置出现了2个或2个以上的题目要求的数字,怎么办,避免重复相加。
-
函数 tmp(int a):
int tmp(int a) {int k=0,s=0;for(int j=a;j!=0;j=j/10){k=j%10;if(k==2||k==0||k==1||k==9){s++;}}return s; }
这个函数用于计算整数 a 中包含多少个数字 0、1、2 或 9。该函数包含以下部分:
- 变量初始化:初始化变量 k 和 s,分别用于存储每个数字和计数。
- 循环:从个位开始循环拆分数字,循环条件是 j 不等于 0,每次循环结束更新 j 的值为 j/10。
- 数字判断:通过取余运算获取每次循环中的个位数字 k,然后判断 k 是否为 0、1、2 或 9,如果满足条件则计数器 s 自增。
- 返回结果:返回计数器 s 的值作为函数的返回值。
-
主程序 main():
int main() {int n;cin>>n;int sum=0,k=0;for(int i=1;i<=n;i++){if(tmp(i)!=0){sum=sum+i;}}cout<<sum;return 0; }
这个主程序实现了以下功能:
- 输入:从标准输入流中获取一个整数 n,用于确定循环范围。
- 变量初始化:初始化变量 sum 和 k 为 0,分别用于存储满足条件的数字之和和临时变量。
- 循环:从 1 开始循环到 n,循环条件是 i 小于等于 n,每次循环结束更新 i 的值加一。
- 条件判断:对每个数 i 调用 tmp() 函数,判断返回值是否不等于 0,如果满足条件则将当前数 i 累加到 sum 中。
- 输出:将 sum 输出到标准输出流中。
- 返回结果:返回 0,表示程序正常结束。