今天白天继续打酱油,损人品。回来只好分享一下自己写的代码,弥补rp。
编程之美2_4,题目原意是给出一个数n,求出1到n这n个数字中1的个数,和boj“北邮超科技大厦”那题相似。很无聊很td的说。书本上的做法不太易懂,就自己写个了,暂时没有发现有bug。
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream>
2 using namespace std;
3 int a[20]={0};
4 int weishu(int n)
5 {
6 int len=0;
7 while(n)
8 {
9 a[len++]=n%10;
10 n/=10;
11 }
12 return len;
13 }
14 int pow10(int n)
15 {
16 int ans=1;
17 int i;
18 for(i=1;i<=n;i++) ans*=10;
19 return ans;
20 }
21 int solve(int n)
22 {
23 int i,j,k,t,ans=0;
24 int len=weishu(n);
25 for(i=0;i<len;i++)
26 {
27 j=i+1;
28 t=0;
29 for(k=j;k<len;k++)
30 t+=a[k]*pow10(k-j);
31 if(a[i]==0)
32 {
33 t*=pow10(i);
34 ans+=t;
35 }
36 else if(a[i]==1)
37 {
38 t*=pow10(i);
39 ans+=t;
40 for(j=0,t=0;j<i;j++)
41 t+=a[j]*pow10(j);
42 t++;
43 ans+=t;
44 }
45 else
46 {
47 t++;
48 t*=pow10(i);
49 ans+=t;
50 }
51 }
52 return ans;
53 }
54
55 int main()
56 {
57 int n;
58 while(cin>>n)
59 cout<<solve(n)<<endl;
60 system("pause");
61 return 0;
62 }
最令人td的是math.h库中的pow精度是double,不能用于这题,开始不知道,老是wa,还以为自己思路错了。自己写个就马上好了。