• <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>

            得到長度
            1. %x="abcd"
            2. #方法一
            3. %expr length $x
            4. 4
            5. # 方法二
            6. %echo ${#x}
            7. 4
            8. # 方法三
            9. %expr "$x" : ".*"
            10. 4
            11. # expr 的幫助
            12. # STRING : REGEXP   anchored pattern match of REGEXP in STRING
            復制代碼


            查找子串
            1. %expr index  $x "b"
            2. 2
            3. %expr index  $x "a"
            4. 1
            5. %expr index  $x "b"
            6. 2
            7. %expr index  $x "c"
            8. 3
            9. %expr index  $x "d"
            10. 4
            復制代碼


            得到子字符串
            1. # 方法一
            2. # expr <string> startpos length
            3. %expr substr "$x" 1 3
            4. abc
            5. %expr substr "$x" 1 5
            6. abcd
            7. %expr substr "$x" 2 5
            8. bcd
            9. # 方法二
            10. # ${x:pos:lenght}
            11. %echo ${x:1}
            12. bcd
            13. %echo ${x:2}
            14. cd
            15. %echo ${x:0}
            16. abcd
            17. %echo ${x:0:2}
            18. ab
            19. %pos=1
            20. %len=2
            21. %echo ${x:$pos:$len}
            22. bc
            復制代碼


            匹配正則表達式
            1. # 打印匹配長度
            2. %expr match $x "."
            3. 1
            4. %expr match $x "abc"
            5. 3
            6. %expr match $x "bc"
            7. 0
            復制代碼


            字符串的掐頭去尾
            1. %x=aabbaarealwwvvww
            2. %echo "${x%w*w}"
            3. aabbaarealwwvv
            4. %echo "${x%%w*w}"
            5. aabbaareal
            6. %echo "${x##a*a}"
            7. lwwvvww
            8. %echo "${x#a*a}"
            9. bbaarealwwvvww
            復制代碼

            其中 , # 表示掐頭, 因為鍵盤上 # 在 $ 的左面。
            其中 , % 表示%,  因為鍵盤上 % 在 $ 的右面。
            單個的表示最小匹配,雙個表示最大匹配。
            也就是說,當匹配的有多種方案的時候,選擇匹配的最大長度還是最小長度。

            字符串的替換
            1. %x=abcdabcd
            2. %echo ${x/a/b} # 只替換一個
            3. bbcdabcd
            4. %echo ${x//a/b} # 替換所有
            5. bbcdbbcd
            復制代碼

            不可以使用 regexp , 只能用 * ? 的文件擴展方式。
            posted @ 2010-06-22 18:44 c++ 學習 閱讀(217) | 評論 (0)編輯 收藏
             
            - You're given the following program:
            --------------------------------
            int main()
            {
                 printf("TWO\n");
                 return 0;
            }
            ---------------------------------
             
            Add any code above or below the lines so that the output is
             
            ONE
            TWO
            THREE
            Give 10 different ways to do this and which of them are specific to C++?

            : just comment it out (already mentioned)
            #include <iostream>
            int main() { std::cout << "ONE\nTWO\nTHREE\n"; return 0; }
            /*
            ...
            */
             
            2: use #if or #ifdef
            #include <iostream>
            #ifdef foo
            ...
            #else
            int main() { std::cout << "ONE\nTWO\nTHREE\n"; return 0; }
            #endif
             
            3: redefine printf (already mentioned)
            #include <iostream>
            #define printf(foo) std::cout << "ONE\n" << foo << "THREE\n";
            ...
             
            4: overload printf (already mentioned, c++ specific)
            void printf(const char * s);
            ...
            #include <iostream>
            void printf(const char * s) { std::cout << "ONE\n" << s << "THREE\n"; }
             
            5: template printf (c++ specific)
            void foo(const char * s);
            template<typename T> void printf(T s) { foo(s); }
            ...
            #include <iostream>
            void foo(const char * s) { std::cout << "ONE\n" << s << "THRE\n"; }
             
            6: redefine main
            #include <iostream>
            int foo();
            int main() {std::cout << "ONE\n"; foo(); std::cout << "THREE\n"; return 0; }
            #define main foo
            ...
             
            7: put main in a namespace (c++ specific)
            #include <iostream>
            namespace foo {
            ...
            };
            int main() { std::cout << "ONE\n"; foo::main(); std::cout << "THREE\n"; return 0; }
             
            8: put main in a class or struct (c++ specific)
            #include <iostream>
            struct foo {
            ...
            };
            int main() { foo bar; std::cout << "ONE\n"; bar.main(); std::cout << "THREE\n"; return 0; }
             
            9: use #define to remove keywords
            #include <iostream>
            int main() {
              printf("ONE\n");
            #define main() do
            #define return
            #define int
            ...
             while (!printf("THREE\n"));
            #undef return
              return 0;
            }
             
            10: abuse a class or struct constructor (c++ specific)
            struct printf { printf(const char * s); };
            ...
            #include <iostream>
            printf::printf(const char * s) { std::cout << "ONE\n" << s << "THREE\n"; }
             
            posted @ 2008-10-11 19:51 c++ 學習 閱讀(318) | 評論 (0)編輯 收藏
             
            Construct a circuit which takes three binary inputs, a, b, c, and creates as outputs their complements, a', b', c', (NOT a, NOT b, NOT c) with the restriction that you may only use two inverters (NOT gates).  You are allowed as many AND and OR gates as you wish, but no other gates, besides these and the two inverters, can be used.
             
            A neat generalization of this problem is "how many inverters do you need to compute the complements of N inputs", but I do not know the answer to this (I don't even know if the answer is known).

            the firs question's answer:
            In black below is a circuit for the 3 with 2 case. Its not the smallest possible such circuit but is written as a hint toward the more general case.  
             
            Its written in C code for easy verification.
             
             
             1 #include <stdio.h>
             2 void main(){
             3  int a,b,c,x,y,z,g,h,a1,b1,c1,x1,y1,z1;
             4  int i;
             5  for(i=0;i<8;i++){
             6   // set up all possible inputs a,b,c
             7   a = i & 1;
             8   b = (i & 2>> 1;
             9   c = (i & 4>> 2;
            10  
            11   x = a & b & c;
            12   y = a & b | a & c | b & c;
            13   z = a | b | c;
            14  
            15   //Here are our 2 inverters
            16   g = !(y);
            17   h = !(x | g & z);
            18    
            19   x1 = g | h;  
            20   y1 = g;
            21   z1 = g & h;
            22   a1 = b & c & x1 | (b | c) & y1 | z1;
            23   b1 = a & c & x1 | (a | c) & y1 | z1;
            24   c1 = b & a & x1 | (b | a) & y1 | z1;
            25  
            26   //print outputs to verify
            27   printf("%d-->%d   %d-->%d   %d-->%d\n",a,a1,b,b1,c,c1);
            28  }
            29 

            posted @ 2008-10-11 18:17 c++ 學習 閱讀(202) | 評論 (0)編輯 收藏
             
            題目:n個數字(0,1,,n-1)形成一個圓圈,從數字0開始,每次從這個圓圈中刪除第m個數字(第一個為當前數字本身,第二個為當前數字的下一個數字)。當一個數字刪除后,從被刪除數字的下一個繼續刪除第m個數字。求出在這個圓圈中剩下的最后一個數字。
            分析:既然題目有一個數字圓圈,很自然的想法是我們用一個數據結構來模擬這個圓圈。在常用的數據結構中,我們很容易想到用環形列表。我們可以創建一個總共有m個數字的環形列表,然后每次從這個列表中刪除第m個元素。
            在參考代碼中,我們用STLstd::list來模擬這個環形列表。由于list并不是一個環形的結構,因此每次跌代器掃描到列表末尾的時候,要記得把跌代器移到列表的頭部。這樣就是按照一個圓圈的順序來遍歷這個列表了。
            這種思路需要一個有n個結點的環形列表來模擬這個刪除的過程,因此內存開銷為O(n)。而且這種方法每刪除一個數字需要m步運算,總共有n個數字,因此總的時間復雜度是O(mn)。當mn都很大的時候,這種方法是很慢的。
            接下來我們試著從數學上分析出一些規律。首先定義最初的n個數字(0,1,,n-1)中最后剩下的數字是關于nm的方程為f(n,m)。
            在這n個數字中,第一個被刪除的數字是m%n-1,為簡單起見記為k。那么刪除k之后的剩下n-1的數字為0,1,,k-1,k+1,,n-1,并且下一個開始計數的數字是k+1。相當于在剩下的序列中,k+1排到最前面,從而形成序列k+1,,n-1,0,k-1。該序列最后剩下的數字也應該是關于nm的函數。由于這個序列的規律和前面最初的序列不一樣(最初的序列是從0開始的連續序列),因此該函數不同于前面函數,記為f(n-1,m)。最初序列最后剩下的數字f(n,m)一定是剩下序列的最后剩下數字f(n-1,m),所以f(n,m)=f(n-1,m)
            接下來我們把剩下的的這n-1個數字的序列k+1,,n-1,0,k-1作一個映射,映射的結果是形成一個從0n-2的序列:
            k+1
                ->    0
            k+2
                ->    1

            n-1
                ->    n-k-2
            0
               ->    n-k-1

            k-1
               ->   n-2
            把映射定義為p,則p(x)= (x-k-1)%n,即如果映射前的數字是x,則映射后的數字是(x-k-1)%n。對應的逆映射是p-1(x)=(x+k+1)%n。
            由于映射之后的序列和最初的序列有同樣的形式,都是從0開始的連續序列,因此仍然可以用函數f來表示,記為f(n-1,m)。根據我們的映射規則,映射之前的序列最后剩下的數字f(n-1,m)= p-1 [f(n-1,m)]=[f(n-1,m)+k+1]%n。把k=m%n-1代入得到f(n,m)=f(n-1,m)=[f(n-1,m)+m]%n。
            經過上面復雜的分析,我們終于找到一個遞歸的公式。要得到n個數字的序列的最后剩下的數字,只需要得到n-1個數字的序列的最后剩下的數字,并可以依此類推。當n=1時,也就是序列中開始只有一個數字0,那么很顯然最后剩下的數字就是0。我們把這種關系表示為:
                     0                  n=1
            f(n,m)={
                     [f(n-1,m)+m]%n     n>1
            盡管得到這個公式的分析過程非常復雜,但它用遞歸或者循環都很容易實現。最重要的是,這是一種時間復雜度為O(n),空間復雜度為O(1)的方法,因此無論在時間上還是空間上都優于前面的思路。
            思路一的參考代碼:
            ///////////////////////////////////////////////////////////////////////
            // n integers (0, 1,  n - 1) form a circle. Remove the mth from
            // the circle at every time. Find the last number remaining
            // Input: n - the number of integers in the circle initially
            //        m - remove the mth number at every time
            // Output: the last number remaining when the input is valid,
            //         otherwise -1
            ///////////////////////////////////////////////////////////////////////
            int LastRemaining_Solution1(unsigned int n, unsigned int m)
            {
                  
            // invalid input
                  if(n < 1 || m < 1)
                        
            return -1;
                  unsigned 
            int i = 0;
                  
            // initiate a list with n integers (0, 1,  n - 1)
                  list<int> integers;
                  
            for(i = 0; i < n; ++ i)
                        integers.push_back(i);
                  list
            <int>::iterator curinteger = integers.begin();
                  
            while(integers.size() > 1)
                  {
                        
            // find the mth integer. Note that std::list is not a circle
                        
            // so we should handle it manually
                        for(int i = 1; i < m; ++ i)
                        {
                              curinteger 
            ++;
                              
            if(curinteger == integers.end())
                                    curinteger 
            = integers.begin();
                        }

                        
            // remove the mth integer. Note that std::list is not a circle
                        
            // so we should handle it manually
                        list<int>::iterator nextinteger = ++ curinteger;
                        
            if(nextinteger == integers.end())
                              nextinteger 
            = integers.begin();
                        
            -- curinteger;
                        integers.erase(curinteger);
                        curinteger 
            = nextinteger;
                  }

                  
            return *(curinteger);
            }


            思路二的參考代碼:
            void circile(int n, int m)
            {
                
            int num = 0;
                
            for(int i = 2; i <= n; i++)
                    num 
            = (num + m) % i;

                num 
            += 1;

                cout 
            << num << endl;
            }



            posted @ 2008-10-07 19:16 c++ 學習 閱讀(391) | 評論 (0)編輯 收藏
             
            我以前曾經設置過 wget 的代理,~/.wgetrc, 現在設置 apt-get 的代理。
            測試了不行,原因一個是字符拷貝的時候,中英文符號轉換的問題,已經改正。
            另外 .wgetrc 中代理是 202.xxx.xxx.xxx:xxxx, 而在 apt.conf 中要寫成 http://202.xxx.xxx.xxx:xxxx


            FWD:為apt-get設置HTTP代理(使用代理更新Ubuntu的方法)
            2008年01月11日 星期五 20:54

            方法一

            這是一種臨時的手段,如果您僅僅是暫時需要通過http代理使用apt-get,您可以使用這種方式。

            在使用apt-get之前,在終端中輸入以下命令(根據您的實際情況替換yourproxyaddress和proxyport)。

            export http_proxy=http://yourproxyaddress:proxyport

            方法二

            這種方法要用到/etc/apt/文件夾下的apt.conf文件。如果您希望apt-get(而不是其他應用程序)一直使用http代理,您可以使用這種方式。

            注意: 某些情況下,系統安裝過程中沒有建立apt配置文件。下面的操作將視情況修改現有的配置文件或者新建配置文件。

            sudo gedit /etc/apt/apt.conf

            在您的apt.conf文件中加入下面這行(根據你的實際情況替換yourproxyaddress和proxyport)。

            Acquire::http::Proxy "http://yourproxyaddress:proxyport";

            保存apt.conf文件。

            方法三

            這種方法會在您的主目錄下的.bashrc文件中添加兩行。如果您希望apt-get和其他應用程序如wget等都使用http代理,您可以使用這種方式。

            gedit ~/.bashrc

            在您的.bashrc文件末尾添加如下內容(根據你的實際情況替換yourproxyaddress和proxyport)。

            http_proxy=http://yourproxyaddress:proxyport
            export http_proxy

            保存文件。關閉當前終端,然后打開另一個終端。

            使用apt-get update或者任何您想用的網絡工具測試代理。我使用firestarter查看活動的網絡連接。

            如果您為了糾正錯誤而再次修改了配置文件,記得關閉終端并重新打開,否自新的設置不會生效。


            from:http://www.stdio.cn/2007/11/proxy-for-apt-get.html
            posted @ 2008-07-22 10:43 c++ 學習 閱讀(1165) | 評論 (0)編輯 收藏
             

            /etc/network/interfaces
            打開后里面可設置DHCP或手動設置靜態ip。前面auto eth0,讓網卡開機自動掛載.

            1. 以DHCP方式配置網卡

            編輯文件/etc/network/interfaces:
            sudo vi /etc/network/interfaces

            并用下面的行來替換有關eth0的行:
            # The primary network interface - use DHCP to find our address
            auto eth0
            iface eth0 inet dhcp

            用下面的命令使網絡設置生效:
            sudo /etc/init.d/networking restart
            也可以在命令行下直接輸入下面的命令來獲取地址

            sudo dhclient eth0

            2. 為網卡配置靜態IP地址

            編輯文件/etc/network/interfaces:

            sudo vi /etc/network/interfaces

            并用下面的行來替換有關eth0的行:# The primary network interface
            auto eth0
            iface eth0 inet static
            address 192.168.3.90
            gateway 192.168.3.1
            netmask 255.255.255.0
            #network 192.168.3.0
            #broadcast 192.168.3.255

            將上面的ip地址等信息換成你自己就可以了.用下面的命令使網絡設置生效:
            sudo /etc/init.d/networking restart

            3. 設定第二個IP地址(虛擬IP地址)

            編輯文件/etc/network/interfaces:

            sudo vi /etc/network/interfaces

            在該文件中添加如下的行:
            auto eth0:1
            iface eth0:1 inet static
            address 192.168.1.60
            netmask 255.255.255.0
            network x.x.x.x
            broadcast x.x.x.x
            gateway x.x.x.x

            根據你的情況填上所有諸如address,netmask,network,broadcast和gateways等信息.
            用下面的命令使網絡設置生效:
            sudo /etc/init.d/networking restart

            4. 設置主機名稱(hostname)

            使用下面的命令來查看當前主機的主機名稱:

            sudo /bin/hostname

            使用下面的命令來設置當前主機的主機名稱:

            sudo /bin/hostname newname

            系統啟動時,它會從/etc/hostname來讀取主機的名稱.

            關于設置主機名稱的更多信息,請訪問這里

            5. 配置DNS

            首先,你可以在/etc/hosts中加入一些主機名稱和這些主機名稱對應的IP地址,這是簡單使用本機的靜態查詢.

            要訪問DNS 服務器來進行查詢,需要設置/etc/resolv.conf文件.
            假設DNS服務器的IP地址是192.168.3.2, 那么/etc/resolv.conf文件的內容應為:

            search test.com
            nameserver 192.168.3.2

            /etc/network/interfaces
            打開后里面可設置DHCP或手動設置靜態ip。前面auto eth0,讓網卡開機自動掛載.

            1. 以DHCP方式配置網卡

            編輯文件/etc/network/interfaces:
            sudo vi /etc/network/interfaces

            并用下面的行來替換有關eth0的行:
            # The primary network interface - use DHCP to find our address
            auto eth0
            iface eth0 inet dhcp

            用下面的命令使網絡設置生效:
            sudo /etc/init.d/networking restart
            也可以在命令行下直接輸入下面的命令來獲取地址

            sudo dhclient eth0

            2. 為網卡配置靜態IP地址

            編輯文件/etc/network/interfaces:

            sudo vi /etc/network/interfaces

            并用下面的行來替換有關eth0的行:# The primary network interface
            auto eth0
            iface eth0 inet static
            address 192.168.3.90
            gateway 192.168.3.1
            netmask 255.255.255.0
            #network 192.168.3.0
            #broadcast 192.168.3.255

            將上面的ip地址等信息換成你自己就可以了.用下面的命令使網絡設置生效:
            sudo /etc/init.d/networking restart

            3. 設定第二個IP地址(虛擬IP地址)

            編輯文件/etc/network/interfaces:

            sudo vi /etc/network/interfaces

            在該文件中添加如下的行:
            auto eth0:1
            iface eth0:1 inet static
            address 192.168.1.60
            netmask 255.255.255.0
            network x.x.x.x
            broadcast x.x.x.x
            gateway x.x.x.x

            根據你的情況填上所有諸如address,netmask,network,broadcast和gateways等信息.
            用下面的命令使網絡設置生效:
            sudo /etc/init.d/networking restart

            4. 設置主機名稱(hostname)

            使用下面的命令來查看當前主機的主機名稱:

            sudo /bin/hostname

            使用下面的命令來設置當前主機的主機名稱:

            sudo /bin/hostname newname

            系統啟動時,它會從/etc/hostname來讀取主機的名稱.

            關于設置主機名稱的更多信息,請訪問這里

            5. 配置DNS

            首先,你可以在/etc/hosts中加入一些主機名稱和這些主機名稱對應的IP地址,這是簡單使用本機的靜態查詢.

            要訪問DNS 服務器來進行查詢,需要設置/etc/resolv.conf文件.
            假設DNS服務器的IP地址是192.168.3.2, 那么/etc/resolv.conf文件的內容應為:

            search test.com
            nameserver 192.168.3.2

            posted @ 2008-07-22 10:41 c++ 學習 閱讀(946) | 評論 (0)編輯 收藏
             
            前一段時間看到一個往年程序競賽的題解, 有一個題目說的是求 100 的階乘末尾有多少個 0. 題解中給出的講解提到, 一個數 n 的階乘末尾有多少個 0 取決于從 1 到 n 的各個數的因子中 2 和 5 的個數, 而 2 的個數是遠遠多余 5 的個數的, 因此求出 5 的個數即可. 題解中給出的求解因子 5 的個數的方法是用 n 不斷除以 5, 直到結果為 0, 然后把中間得到的結果累加. 例如, 100/5 = 20, 20/5 = 4, 4/5 = 0, 則 1 到 100 中因子 5 的個數為 (20 + 4 + 0) = 24 個, 即 100 的階乘末尾有 24 個 0. 其實不斷除以 5, 是因為每間隔 5 個數有一個數可以被 5 整除, 然后在這些可被 5 整除的數中, 每間隔 5 個數又有一個可以被 25 整除, 故要再除一次, ... 直到結果為 0, 表示沒有能繼續被 5 整除的數了.

            今天無 意間看到有人問 1000 的階乘有幾位數, 上來就用上面的方法算了一下, 249, 又讀一遍題目, 才發現是求所有的位數, 想了好久也沒有思路, 無奈用 Python 算了一把, 結果有 2568 位, 可是依然不知道如何計算 1000 階乘的位數, 還好通過結果驗證了末尾有 249 個 0 是正確的...
            posted @ 2008-06-26 14:23 c++ 學習 閱讀(2959) | 評論 (13)編輯 收藏
             
            這是在 2006 年 11 月 17 日瀏覽小百合時得到的,當時上不來,就暫存在我的信箱里了。

            南京大學小百合站,Algorithm 版,x->18->1 和 x->18-2。

            x->18->1:(兩處紅色標記是我個人加上的,懷疑原文有誤,即若有 10 和 100,則前面不應有 90 和 1800)
            令結果為 x
            x=log2+log3+...+log9
              +90+log1.1+log1.2+...+log9.9
              +1800+log1.01+log1.02+...+log9.99
              +3
             =∫logx dx (從2到10)
              +90+10∫logx dx(從1.1到9.9)
              +1800+ 100∫logx dx (從1.01到9.99)
              +3
             = ...
            后兩次積分上限的不同是考慮到修正

            x->18->2:
            x=(∫log(x)dx(2--1001)+∫log(x)dx(1--1000))/2
             =((x*log(x)-∫xdlog(x))(2--1001)+(x*log(x)-∫xdlog(x))(1---1000))/2
             =2567.857000.....


            我個人的想法:

            經過上述兩個方法,我猜想求解一個數的位數可以求解該數對其基數的對數(此處是以 10 為基數的),找了幾個數寫了寫,發現可以:
            一個以 b 為基數的數 N,在以 b 為基數的計數系統中的位數 l,可以通過求 N 對 b 的對數求得。
            具體為:l=floor[log b (N) + 1],即求對數,結果加 1 后向下取整。
            例如:
            • length(123456789)10=floor[lg(123456789)+1]=floor[8.091514977+1 ]=9
            • length(100000000)10=floor[lg(100000000)+1]=floor[8+1]=9
            • length(10101)2=floor[log 2 (23) + 1]=floor[4.523561956+1]=5  (10101)2=(23)10
            再回到求解 1000 的階乘的位數上,則根據上面的說明,有:(設 1000 的階乘結果為 N)
            length(N)10=floor[lg(N)+1]
                       =floor[lg(1*2*3*...*999*1000)+1]
                       =floor[lg1+lg2+lg3+...+lg999+lg1000+1]
                       =floor[lg2+lg3+...lg999+lg1000+1]    <= lg1=0
            這時問題轉到了求解 lg2+lg3+...+lg999+lg1000 的累加上面。

            對于這一方面我不是很清楚(高等數學基本都不記得了...),不過根據前面兩篇文章,好像有:
            ∑(N=2..1000)lgN = ∫lgxdx (x=2..1000)

            如果成立的話,則根據 lgx = lnx/ln10 有:
            ∫lgxdx (x=2..1000) = (1/ln10)*∫lnxdx (x=2..1000)
                               = (1/ln10)*[x*lnx - ∫xd(lnx)] (x=2..1000)
                               = (1/ln10)*[x*lnx - ∫dx] (x=2..1000)
                               = (1/ln10)*[x*lnx - x] (x=2..1000)
                               = x*(lnx - 1)/ln10 (x=2..1000)

            然后由牛頓-萊伯尼茨公式可以得到:(也不知道是否能在此處應用...)
            ∫lgxdx (x=2..1000) = 1000*(ln1000 - 1)/ln10 - 2*(ln2 - 1)/ln10
                               = [1000*(6.907755279 - 1) - 2*(0.693147181 - 1)]/ln10
                               = [1000* 5.907755279 - 2*(-0.306852819)]/2.302585093
                               = [5907.755279 - (- 0.613705639)]/2.302585093
                               = 5908.368984639/2.302585093
                               = 2565.97204707

            將結果代回前面的式子:
            length(N)10 = floor[2565.97204707 + 1] = 2566

            原先通過 Python 計算過 1000 的階乘,位數為 2568 位。

            考慮前面推算的過程中把 x=1 時 lg1 略掉了,理論上不應產生區別,但若要是不略掉該項時,則結果變成:
            ∫lgxdx (x=2..1000) = 1000*(ln1000 - 1)/ln10 - 1*(ln1 - 1)/ln10
                               = [1000*( 6.907755279 - 1) - 1*(0 - 1)]/ln10
                               = [1000*5.907755279 - 1*(-1)]/2.302585093
                               = [5907.755279 + 1]/2.302585093
                               = 5908.755279/2.302585093
                               = 2566.13981258

            length(N)10 = floor[2566.13981258 + 1] = 2567

            可見結果略有不同,但都與正確結果有一點小偏差,個人認為思路是正確的,方法還有待改進。同時看到第二篇引文的結果非常接近,不過我還不理解,還需在琢磨琢磨。

            還要再好好看看高等數學...


            posted on 2007-01-11 12:14 ScorpioLove 閱讀(1261) 評論(4)  編輯 收藏 所屬分類: 數據結構與算法
             
            把求lgN(N=2.3.4....1000)轉換為積分,這個思路就有誤差吧。
            積分是連續的,而這里的N是離散的,所以這里的轉換不合理。
            Posted @ 2007-04-18 09:25    回復  引用  查看    
            #2樓 
            你紅字加的內容不對,不應該乘10和100;
            樓上的說的也不對,把不可直接求職的離散轉為積分是基本的方法,只要誤差允許接受就可以,具體可以看CLRS的附錄A
            Posted @ 2007-04-24 10:07    回復  引用  查看    
            #3樓 [樓主]
            謝謝各位回復,同時希望能原諒我不能及時的回復各位。

            @ 蔡暉

            事實上這個問題,我在計算前也考慮過,確實有誤差,不過就像 wqx 說的,只要誤差可接受就可以了,像這里的誤差相對于實際結果而言是比較小的,可以接受。

            @ wqx

            關于紅字部分,我在算式前面的括號里注明了,10 和 100 是原來算式里就有的,但我覺得不該加,所以就用紅色標記了一下,可能導致你誤以為是我強調要加上的...

            關于 CLRS,我目前正在讀,不過感覺好難啊,好多課后題都不會...
            如果可能,希望能和你交流一下^_^。
            Posted @ 2007-04-24 13:26    回復  引用  查看    
            #4樓 
            居然看到了牛頓萊布尼茨公式。。。。。
            Posted @ 2007-09-18 17:53    回復  引用  查看   
            posted @ 2008-06-26 14:22 c++ 學習 閱讀(1670) | 評論 (0)編輯 收藏
             
            #include <string>
            #include 
            <iostream>
            #import 
            <msxml4.dll>

            void SendData(std::wstring url, std::wstring username, std::wstring password)
            {

                HRESULT hr;
                MSXML2::IXMLHTTPRequestPtr pIXMLHTTPRequest;
                MSXML2::IXMLDOMDocumentPtr pXMLDoc;
                std::wstring wvarQuery(L
            "username=");
                wvarQuery.append(username);
                wvarQuery.append(L
            "&password=");
                wvarQuery.append(password);
                _variant_t vartQueryFields(wvarQuery.c_str());

                
            try
                {
                    CoInitialize(NULL);
                    hr
            =pIXMLHTTPRequest.CreateInstance(__uuidof(MSXML2::XMLHTTP));
                    SUCCEEDED(hr) 
            ? 0 : throw hr;

                    hr
            =pIXMLHTTPRequest->open("POST", url.c_str(), 
                        
            false);
                    SUCCEEDED(hr) 
            ? 0 : throw hr;
                    
            //如果要向服務器post數據,這個地方一定要設置為application/x-www-form-urlencoded
                    pIXMLHTTPRequest->setRequestHeader("Content-Type""application/x-www-form-urlencoded");

                    hr 
            = pIXMLHTTPRequest->send( vartQueryFields );
                    SUCCEEDED(hr) 
            ? 0 : throw hr;
                    
            //拿到返回來的xml數據
                    pXMLDoc=pIXMLHTTPRequest->responseXML;
                    
            //后面就是對拿回來的xml數據進行解析,主要是dom方法
                }
                
            catch()
                {
                    
            if(pIXMLHTTPRequest)
                        pIXMLHTTPRequest.Release();
                    
            if(pXMLDoc)
                        pXMLDoc.Release();
                    CoUninitialize();
                }
            }


            int main()
            {
                SendData(L
            "http://localhost/login.php", L"kenwell", L"kenwell");
            }

            posted @ 2008-05-21 18:41 c++ 學習 閱讀(4389) | 評論 (0)編輯 收藏
             
            #include <string>
            std::
            string ws2s(const std::wstring& ws)
            {
                std::
            string curLocale = setlocale(LC_ALL, NULL);        // curLocale = "C";
                setlocale(LC_ALL, "chs");
                
            const wchar_t* _Source = ws.c_str();
                size_t _Dsize 
            = 2 * ws.size() + 1;
                
            char *_Dest = new char[_Dsize];
                memset(_Dest,
            0,_Dsize);
                wcstombs(_Dest,_Source,_Dsize);
                std::
            string result = _Dest;
                delete []_Dest;
                setlocale(LC_ALL, curLocale.c_str());
                
            return result;
            }

            std::wstring s2ws(
            const std::string& s)
            {
                setlocale(LC_ALL, 
            "chs"); 
                
            const char* _Source = s.c_str();
                size_t _Dsize 
            = s.size() + 1;
                wchar_t 
            *_Dest = new wchar_t[_Dsize];
                wmemset(_Dest, 
            0, _Dsize);
                mbstowcs(_Dest,_Source,_Dsize);
                std::wstring result 
            = _Dest;
                delete []_Dest;
                setlocale(LC_ALL, 
            "C");
                
            return result;
            }

            這些都是最近自己在開發項目中用到的
            posted @ 2008-05-21 18:23 c++ 學習 閱讀(29413) | 評論 (2)編輯 收藏
            僅列出標題
            共3頁: 1 2 3 
             
            性做久久久久久久久久久| 久久精品成人免费网站| 亚洲精品乱码久久久久久| 国产精品久久午夜夜伦鲁鲁| 26uuu久久五月天| 久久免费视频6| 国产69精品久久久久777| 久久久久亚洲精品天堂久久久久久| 99久久精品免费看国产一区二区三区 | 久久综合精品国产二区无码| 国产69精品久久久久777| 久久久久99这里有精品10 | 亚洲欧美日韩精品久久亚洲区| 国产精品久久久久国产A级| 无码精品久久一区二区三区| 色综合久久中文综合网| 久久人人爽人人爽人人片AV不| 亚洲国产日韩欧美综合久久| 草草久久久无码国产专区| 精品无码久久久久久午夜| 久久婷婷五月综合国产尤物app | 日韩久久无码免费毛片软件| 久久91综合国产91久久精品| 午夜天堂精品久久久久| 一级做a爰片久久毛片毛片| 国产精品美女久久久免费| 日本一区精品久久久久影院| 久久精品国产亚洲av高清漫画| 亚洲AV日韩精品久久久久久久| 日本久久中文字幕| 欧美伊人久久大香线蕉综合69| 很黄很污的网站久久mimi色 | 国产精品久久久久蜜芽| 免费一级欧美大片久久网| 久久AⅤ人妻少妇嫩草影院| 国产一区二区精品久久凹凸 | 久久96国产精品久久久| 国产成人精品久久二区二区| 国产精品久久久久久搜索| 久久精品国产只有精品2020| 亚洲国产精久久久久久久|