题目:
【问题描述】 小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的和是多少?
【输入格式】
输入一行包含两个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】 40
【样例输出】 574
【评测用例规模与约定】 对于 20% 的评测用例,1≤n≤10。 对于 50% 的评测用例,1≤n≤100。 对于 80% 的评测用例,1≤n≤1000。 对于所有评测用例,1≤n≤10000
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include<iostream> #include<algorithm> #define maxn 10000 using namespace std; int num[maxn]; int len; void init() { len=1; num[0]=0; } bool judge(int a) { int t; while(a) { t=a%10; if(t==2||t==0||t==1||t==9) return true; a=a/10; } return false; }
int add(int i,int len) { int t=i,n=0,temp[maxn]; while(t){ temp[n]=t%10; t=t/10; n++; } int flag=0; if(n==len&&temp[n-1]+num[len-1]>=10) { for(int i=0;i<=len;i++) { flag=temp[i]+num[i]+flag; num[i]=flag%10; flag=flag/10; } len++; } else for(int i=0;i<=len;i++) { flag=temp[i]+num[i]+flag; num[i]=flag%10; flag=flag/10; } return len; } int main() { int n,sum=0; init(); cin>>n; for(int i=1;i<=n;i++) { if(judge(i)) len=add(i,len); } for(int i=len-1;i>=0;i--) { cout<<num[i]; }
}
|