現在的位置: 首頁 > 綜合 > 正文

知識點積累(一)

2019年02月26日 ⁄ 綜合 ⁄ 共 3645字 ⁄ 字型大小 評論關閉

一、NYOJ 最小公倍數

       解題思路:1~n 的最小公倍數為小於 n 的所有質數的最大冪(值小於n)的乘積。

       比如 n=10 小於 10 的質數有 2 3 5 7 對應的最大冪是: 3  2  1  1 ,所以最小公倍數是: 2^3 * 3^2 * 5^1 * 7^1 = 2520 。 

      
優代碼~~>

二、NYOJ Digit Problem

       解題思路:由遞推思想可以推出到某一位的總位數(由各個數的位數遞推相加得到),如果求第 n 位,用二分查找下界得到下標 x ,如果相等則是當前查找到的下標的個位,否則用 n 減 x-1 的總位數 ,再用二分查找從 1 到單個數字 再減去比它小的一個。最後分解第二次返回的下標 。

      思路有可能解釋的不太清晰:代碼(1)代碼(2)。

三、NYOJ 階乘的0 ||階乘因式分解(二)

       解題思路:這兩個題思路一樣在這隻說階乘的0的思路,計算 N !最後 0 的個數就等於計算 2 和 5 的個數,有於 2 總是比 5 多所以直接計算 包含 5 的個數。

      
代碼~~>

四、STL之 string

       string是在做一道搜索題時了解到的,如果不用就會超內存。使用string必須包含頭文件  #include<string>, string  類的字元串對象的使用方法與其他對象一樣,也必須先定義才可以使用。

      定義:string   對象1 ,對象2…… ;

      例如:string   str1,str2  ;    string str3(「china」);//定義string類對象str3同時對其初始化。

       基本運算(只列舉幾種):

                       s1 = s2  ; 用s2給s1賦值 ;        s1 + s2  ;  用s1和s2連接成一個串 ;      s1 + = s2 ; 等價於 s1 = s1 + s2 ;                                    

                       s1 == s2 ;判斷s1是否與s2相等 ;           s1[i]  ; 訪問串對象s1中下標為i的字元 ;

                       cin >> s1 ;從鍵盤輸入一個字元串給串對象s1 ;                     cout << s1 ;  將串對象s1輸出 ;(用c++格式輸入輸出)。

五、STL之map

        map也是在做一道題時想不出方法來了,聽說map可以搞定,於是……

        頭文件: #include<map>  .

#include <cstdlib>
#include <iostream>
#include <map>
using namespace std;
int main(int argc, char *argv[])
{
    // 構造
    map<string, string> m1, m2;
    map<int , int>m1,m2 ;
    map<string , int>m1,m2 ;
    map<int , string>m1,m2 ;
    map<string, string>::iterator start; // 用於遍歷 map
    // 插入兩種方法
    m1.insert(pair<string, string>("1", "hello"));
    m1.insert(pair<string, string>("2", "world"));
    m2["3"] = "test";
    m2["4"] = "swap";
    // 交換
    swap(m1, m2);
    // 遍歷  start->first 代表  map 中第一個值,start->second 代表 map 中第二個值
    for (start = m1.begin(); start != m1.end(); start++)
    {
        cout << start->second << endl;
    }
    cout << endl;
    m2.clear(); // 清空
    if (m2.empty()) // 判斷是否為空,空為真
       cout << "m2 is empty" << endl << endl;
    //擦除
    m1.erase("3");
    m1.erase("3");
    m1.erase("H");
    // 在 map 中尋找 「4」
    start = m1.find("4");
    if (start != m1.end())
       cout << start->first << " is in m1, and the value is "
            << start->second << endl << endl;
    else
        cout << "cannot find the key" << endl << endl;
    cout << "m1 has " << m1.count("4") << " value(s) with the key 4" << endl << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

六、篩法||線性篩法

相關題目~~>

篩法思想:一個素數的倍數(大於2倍)一定是合數,只要把所有的素數的倍數都標記就可以。複雜度:O(long long(n)*n)。

代碼:

 for(i=2 ;i<n ;i++)
       if(!prime[2])
         for(j=i+i ;j<n ;j+=i )
             prime[j]=true ;

線性篩法思想:上面那個篩法一個合數可能標記許多次,線性篩法只標記一次,一個合數一定可以分解一個素數與另一個數的乘積,標記合數時用那個合數最小的素因子標記。例如:標記 30 用 2 * 15 標記,即 i = 15 ,而不用 3 * 10 去標記,可以用 if ( ! ( i % prime [ j ] ) )     break ; 來解決。如果 i = 10 ;執行到 2 時,如果繼續用 3 與 10 相乘就多餘了,因為 10 可以分解出素數 2 ,2 比 3 小,所以用
2 去標記 30 。也可以求出每個合數的最小素因子。複雜度:O(n)。

for(i=2 ;i<M ;i++)
    {
        if(!is_prime[i])      prime[num++]=i ;
        for(j=0 ;(j<num&&i*prime[j]<M) ;j++)
        {
           is_prime[i*prime[j]]=true ;
           if(!(i%prime[j]))
                               break ;
        }
    }

七、用函數測試程序的運行時間

不再多說直接上代碼:

#include<iostream>
#include<time.h>
using namespace std ;
int main()
{
    clock_t  start,finish ;
    start=clock() ;
    // 中間放程序
    finish=clock() ;
    cout<< (double)(finish - start) / CLOCKS_PER_SEC ;//運行時間:
    // 除以 CLOCKS_PER_SEC 是讓時間轉化成秒(原先是以毫秒為單位) 
    return 0 ;
}
 

 八、NYOJ Max Gcd

做題感悟:這題是上次比賽的題,傷心啊!開始做這題時如果排一下序就對了(當時自認為已經排序),做完題後看別人的代碼基本上都是一種方法,為什麼自己做題時沒想到呢!也許是高看這題了,也許是做的題太少,也許是思想太狹小。

解題思路:(1)找到一個最大的值,最大公約數一定小於等於最大值,讓最大值每次減一,看是否被 1 ~ n 中的兩個數整除,如果可以就找到解了。

               (2)先把素數表打出來,排一下序,從小到大開始遍歷,找最大公約數,如果這個數是素數不變歷(還要判斷一下是否與前一個數相等),否則遍歷。

本人代碼~> 優代碼~>

九、HDU 1575 Tr A

做題感悟:剛複習了一下矩陣+快速冪,於是練習了一下。定義變數定義錯了,開始定義為全局變數執行完後沒有重新初始化。第二次定義為局部變數也沒有初始化害羞

代碼~>

十、關於Fibonacci

如果一個為 Fibonacci 序列知道前兩項 x ,y 就可以用公式求出第 N 項 先把原  Fibonacci  數列列印出來F[ 1 ]=1 , F[ 2 ]=1 ,  F[ 3 ]=2 ,F[ 4 ]=3 , F[ 5 ]=5 。。。。。然後求當前數列第 N 項     f [ N ] = F[ N-1 ] * y + F[ N-2 ] * x  ;

十一、關於對數

定義、  令 b 是大於 1 的實數,x 是實數。如果對某些正實數 y ,有 y = b ^ x ,那麼 x 稱為 y 以 b 為底的對數,記為: x = log b ( y ) .其中,b 稱為對數的底數,y 稱為真數。

關於對數的公式有下列性質:

          (1)、負數和零沒有對數.

          (2)、1 的對數是 0 ,即 logb (1) = 0 .

          (3)、底數的對數是 1 ,即log b(b)= 1 .

          (4)、logb( b ^ n ) = n .

          (5)、b ^ ( logb( n ) ) = n .

          (6)、logb( m * n ) = logb( m ) + logb( n ) .

          (7)、logb( m / n ) = logb( m ) - logb( n ) .

          (8)、logb( m ^ n ) =n * logb( m ) .

特殊對數:以 10 為底的對數稱為常數對數,即 N 的常數對數記做 lgN .以無理數 e ( e = 2.71828…… ) 為底的對數稱為自然對數,N 的自然對數記做 ln N ; 以 2 為底的對數記為 log N . 

 

 

 

 

抱歉!評論已關閉.