我住包子山

this->blog.MoveTo("blog.baozishan.in")

pku 3286解题报告

我的做法可能很弱智
给定一个数x>0算通过每一位零出现次数的统计,算出所有的0的次数(从1到X)

举一个例子
2508这个数
首先考虑个位数
250X  X=0;一共有250-1+1个
25X8  X=0;一共有258-10+1个
2X08 X=0;注意并不只有208-100+1中可能,我之前就错在这里了,因为最大2508,所以2099-2009这百位的零我就没有考虑到,所以这里的0有299-100+1个

于是题目就做出来了

输入一个a b
a<b
a==0时
b统计出零的个数然后加1(0)的个数
否则从a 到 b的0的个数则是从1到b的0个数减去从1到a-1的零的个数
a<10的情况我害怕出错就分开写了,所以整个程序有些长

下面就是我笨拙的代码

 1#include <iostream>
 2#include <string>
 3#include <cstdio>
 4#include <cstdlib>
 5#include <cmath>
 6using namespace std;
 7long long aarray[10]={0};
 8long long barray[10]={0};
 9long long diff[10]={0};
10char tempstr[10= "";
11
12
13int calc(std::string str,int i)
14{
15    //str.erase()
16    if(i==(str.size()-1)) return 0;
17    long long sum=0,len=str.size();
18    int needminus = int(pow(10.0,i));
19    //if(i!=0)str[len-i-2]+=(str[len-i-1]-'0');//new add
20    if(str[len-i-1]=='0')
21    {
22    str.erase(len-i-1,1);
23    }

24    else
25    {
26        str.erase(len-i-1,i+1);
27        str.append(i,'9');
28    }

29    for(int i=0;i<str.size();i++)
30    {
31        sum=sum*10+(str[i]-'0');
32    }

33    sum-=needminus;
34    sum+=1;
35    return sum;
36}

37
38int main()
39{
40    unsigned int a,b;
41    std::string tempstring;
42    int add;
43    while(scanf("%u %u",&a,&b))
44    {
45        add=0;
46
47        if(a==0)
48            add=1;
49        else {
50            add=0;
51            a--;
52        }

53        if(a==-2)
54            break;
55        int alen,blen;
56        if(a<10)
57        {
58            aarray[0]=0;
59        }

60        else
61        {
62            _i64toa(a,tempstr,10);
63            alen = strlen(tempstr);
64            tempstring.assign(tempstr);
65            for(int i=0;i<alen;i++)
66            {
67                aarray[i]=calc(tempstring,i);
68            }

69        }

70        _i64toa(b,tempstr,10);
71        blen = strlen(tempstr);
72        tempstring.assign(tempstr);
73        for(int i=0;i<blen;i++)
74        {
75            barray[i]=calc(tempstring,i);
76        }

77        for(int i=0;i<blen;i++)
78        {
79            diff[i]=barray[i]-aarray[i];
80        }

81        long long sum=0;
82        for(int i=0;i<blen;i++)
83        {
84            sum+=diff[i];
85        }

86        
87        cout<<sum+add<<endl;
88        memset(aarray,0,sizeof(long long)*10);
89        memset(barray,0,sizeof(long long)*10);
90        memset(diff,0,sizeof(long long)*10);
91    }

92}


 

posted on 2007-07-25 08:20 Gohan 阅读(570) 评论(0)  编辑 收藏 引用 所属分类: C++Practise


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理