• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            這是《算法設(shè)計與分析》教材上的一道題,我們老師布置的第一道題。說的是統(tǒng)計出一本給定頁碼書中從0~9各個數(shù)字出現(xiàn)的次數(shù),頁碼最高不差過10e9。
            窮舉法是很容易想到的,不過當(dāng)輸入過大時很耗時間。因此應(yīng)該總結(jié)規(guī)律。
            #include<stdio.h>
            #include
            <string.h>
            #include
            <stdlib.h>
            #include
            <math.h>
            #define LEN 20
            int bs[] = {0120300400050000600000700000080000000900000000};
            int BS = 1111111111;
            void StrtoNum(char *str, int *num)
            {
                
            int i, len;
                len 
            = strlen(str);
                
            *num = 0;
                
            for(i = 0; i < len; i++)
                    
            *num = *num * 10 + str[i] - '0';
            }

            int Pow(int a, int b)
            {
                
            int i, t;
                t 
            = a;
                
            for(i = 0; i < b - 1; i++)
                    t 
            *=a;
                
            return t;
            }

            int GetMod(int a)
            {
                
            return BS % Pow(10, a);
            }

            int main()
            {
                
            int i, j;
                
            int nb;// now bit
                char nums[LEN];
                
            int num;
                
            int rs[10];// result 
                int len;
                
            int mh;//most high 
                int nt;
                
            while(gets(nums) != NULL)
                
            {
                    memset(rs, 
            0sizeof(rs));
                    len 
            = strlen(nums);
                    StrtoNum(nums, 
            &num);
                    
            //
                    
            //printf("num = %d\n", num);
                    
            //
                    mh = nums[len - 1- '0';
                    
            for(i = 0; i <= mh; i++)//init the lowest bit
                        rs[i] = 1;
                    
            for( i = 1; i < len; i++)
                    
            {
                        nb 
            = len - i -1;
                        mh 
            = nums[nb] - '0';
                        StrtoNum(
            &nums[nb + 1], &nt);
                        
            //
                        
            //printf("mh = %d nt = %d\n", mh, nt);
                        
            //
                        rs[mh] += nt + 1;//@2, mh mh
                        for(j = 0; j < mh; j++)//@2 others
                        {
                            rs[j] 
            += Pow(10, i); 
                        }

                        
            for(j = 0; j < 10; j++)//@1
                        {
                            rs[j] 
            += mh * bs[i];
                        }
                        
                    }

                    rs[
            0-= GetMod(len);
                    
            for(i = 0; i < 10; i++)
                        printf(
            "%d %d\n", i, rs[i]);
                }

                
            //getchar();
            }

            統(tǒng)計出只有一位數(shù)的情況是很簡單的,我們來當(dāng)在統(tǒng)計好的一個數(shù)字前面再加上位數(shù)時統(tǒng)計結(jié)果會怎么增加。我們可以把這個增加的值看做兩部分,一部分是因高位增加導(dǎo)致地位數(shù)的取值范圍增大而導(dǎo)出的,另一部分是高位本身產(chǎn)生的。兩方面的計算都有規(guī)律可循。要特別注意0的計算。
            請注意庫函數(shù)pow()的返回值為double,轉(zhuǎn)換為int時會有精度丟失(調(diào)試中的表現(xiàn)為無論數(shù)據(jù)多大,結(jié)果總跟標(biāo)準(zhǔn)答案相差1),因此這里特地寫了一個Pow()函數(shù)做返回值為int的乘方計算。
            posted on 2012-03-08 19:38 小鼠標(biāo) 閱讀(1111) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2012年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            隨筆分類(111)

            隨筆檔案(127)

            friends

            最新評論

            閱讀排行榜

            久久AV高清无码| 国产成人香蕉久久久久| 婷婷综合久久中文字幕蜜桃三电影 | 国产aⅴ激情无码久久| 久久精品国产亚洲av高清漫画 | 性做久久久久久免费观看| 日韩精品久久无码人妻中文字幕| 久久精品国产精品青草app| 亚洲精品视频久久久| 国产精品久久久久影院嫩草| 午夜精品久久久久久久无码| 国产精品欧美久久久久无广告| 亚洲国产精品无码久久一线 | 久久久国产亚洲精品| 国产亚洲欧美成人久久片| 狠狠综合久久AV一区二区三区| 国产精品成人精品久久久| av无码久久久久不卡免费网站| 久久精品一本到99热免费| 久久精品国产亚洲Aⅴ蜜臀色欲| 99久久精品毛片免费播放| 亚洲人成伊人成综合网久久久| 久久精品无码一区二区三区日韩 | 99久久精品国产一区二区| 久久精品国产69国产精品亚洲| 久久夜色精品国产噜噜麻豆| 久久精品亚洲AV久久久无码| 久久婷婷是五月综合色狠狠| 亚洲美日韩Av中文字幕无码久久久妻妇 | 久久婷婷是五月综合色狠狠| 久久综合狠狠综合久久| 精品欧美一区二区三区久久久| 久久久无码精品亚洲日韩软件| 69国产成人综合久久精品| 国产精品对白刺激久久久| 久久久久久人妻无码| 中文字幕日本人妻久久久免费| 亚洲国产美女精品久久久久∴| 久久亚洲日韩精品一区二区三区| 色偷偷88888欧美精品久久久| 日韩精品久久久肉伦网站|