题目:
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?
输入:一个整数n(1≤n≤10000)
输出:在 1 到 n 中,计算含有2、0、1、9这几个数字的数字和
#include<bits/stdc++.h> //万能头文件
using namespace std;
int main()
{
int n; //这个是判断的范围
cin>>n; //输入范围n
long long sum=0; // 满足条件的数的和sum,因为怕和过大所以设置成了long long类型
for(int i=1;i<=n;i++)
{
int j=i; // 这里将i的值赋给j,因为要判断含不含特殊数字时肯定要对其进行取余和除法,如果继续用i表示的话,会破坏for循环条件
int biaoji=0; //这里的标记是用来帮助判断是否退出下面的while循环
while(j!=0)
{
if(j%10==0||j%10==1||j%10==2||j%10==9) //判断j对10取余后是否包含特殊数字
{
sum=sum+i; //如果包含,则要求和,注意这里求和时加的是i的值,而不是j的值,因为j的值如果个位数上没有包含特殊值的话会对其进行除法
biaoji=1; //如果这个数上有一位已经满足这个条件,则直接将标记的值改为1,即该数字已经满足条件,无需再进行while循环
}
if(biaoji==0) j=j/10;//如果这个数字目前还未包含特殊数字,则除以10,因为j为int类型,故除以10会自动取整
if(biaoji==1) j=0;//如果这个数字已经包含了特殊数字,则直接将j变为0,即不满足while的循环条件
}
}
cout<<sum; //输出最后的和
return 0;
}
易错点;当i有一位数满足0、1、2、9时即可退出循环,而无需继续,避免重复计算累加和
嘻嘻,可以看一下注释,有比较详细的解释