所有的計(jì)算最后都是轉(zhuǎn)換成二進(jìn)制進(jìn)行計(jì)算的,所以浮點(diǎn)計(jì)算時(shí)候,有時(shí)會(huì)出現(xiàn)精度流失的問(wèn)題。
解決方法:
盡量轉(zhuǎn)換成long型計(jì)算,最后再換成浮點(diǎn)型輸出結(jié)果。
查詢(xún)數(shù)據(jù)是否存在刷題時(shí)候測(cè)試點(diǎn)也不一定會(huì)考察這方面,但當(dāng)很多個(gè)浮點(diǎn)型數(shù)據(jù)運(yùn)算時(shí)候丟失精度就更明顯了。當(dāng)題目中告訴我們每個(gè)數(shù)的小數(shù)點(diǎn)最高幾位的時(shí)候,我們還是最好先轉(zhuǎn)換成long型最后再換回來(lái),這樣更為準(zhǔn)確。
如果可以在set和map中進(jìn)行查詢(xún)find,就別在vector容器中查詢(xún)用find,因?yàn)関ector中的find的algorithm的find,時(shí)間復(fù)雜度是O(n),而set和map是自帶的函數(shù),內(nèi)部結(jié)構(gòu)是紅黑樹(shù)。
但是如果是set和map的話,用count就可以了,因?yàn)樗麄儍?nèi)部都不是重復(fù)的。時(shí)間復(fù)雜度和find一樣是(logn);
用map.count(key)是否大于0查找數(shù)據(jù)應(yīng)該是用的比較多的。
有時(shí)需要把答案放在容器內(nèi),然后把所寫(xiě)的放另一個(gè)容器里,比較是否與答案相等,這個(gè)時(shí)候就有必要用到容器之間是否相等。
容器之間比較內(nèi)部所有元素是否相等,可以直接用**==**
如果兩個(gè)容器的長(zhǎng)度相同且對(duì)應(yīng)位置元素都相等,則兩個(gè)容器就相等,否則不等。
和Java
中重寫(xiě)equals
后用equals
方法有點(diǎn)像。
使用cin
輸入數(shù)據(jù)后,會(huì)殘留空格或者回車(chē)符在緩存區(qū)中;
使用getline
輸入數(shù)據(jù)后,不會(huì)有回車(chē)在緩存區(qū)中。
#include#includeusing namespace std;
int main(){char ch;
string s,s1;
cin >>s;
getline(cin,s1);
cout<< s<< endl;
cout<< s1<< endl;
}
輸入:
a b
輸出:
a
b
輸入:
ab
輸出:
ab
出現(xiàn)需要處理字符的原因:
是因?yàn)?code>cin遇到空格或者回車(chē)字符時(shí),是作為結(jié)束符的,但是其本身還是存留在緩沖中,遇到要么作為結(jié)束符要么就是直接跳過(guò)。既然在緩沖中,如果不需要就需要將其除去;
解決方法:
cin
肯定是比scanf
方便的,但有很多時(shí)候還是用scanf
比較的好。
比如要輸入年:月:日
用cin
肯定是不好實(shí)現(xiàn)的,用scanf("%d:%d:%d",&year,&month,&day);
肯定會(huì)方便簡(jiǎn)潔。
并且學(xué)會(huì)輸入數(shù)據(jù)的同時(shí),處理數(shù)據(jù),這樣可以達(dá)到簡(jiǎn)潔代碼,防止代碼重復(fù)。
下面就是個(gè)好例子:
使用數(shù)組達(dá)到hash
的目的是比使用map
要方便很多的,我們可以利用它的索引以及對(duì)應(yīng)的值表示不同的含義。
比如:
索引表示學(xué)號(hào),值表示排名;
索引表示學(xué)號(hào),值表示是否存在;
索引表示時(shí)間,值表示數(shù)據(jù)量;
索引表示某字符的ASCII碼,值表示是否存在等等。
通過(guò)hash數(shù)組,可以讓我們查詢(xún)結(jié)果更快,效率更高!
bool is_prim(int n){if(n<2) return false;
for(int i=2;i*i<=n;++i){if(n%i==0) return false;
}
return true;
}
倆數(shù)大公約與最小公倍假設(shè)有倆數(shù)a和b,大公約數(shù)gcd
和最小公倍數(shù)lcm
的乘積應(yīng)該為a*b
;
大公約數(shù):
//a大于b
int gcd(int a,int b){return a%b==0?b:gcd(b,a%b);
}
數(shù)因子void ff(int n,vector&res){for(int i=1;i<=n;++i){if(n%i==0)
res.push_back(i);
}
}
常用的頭文件及其內(nèi)部函數(shù)只說(shuō)用的部分函數(shù),咋用這里木得
< map >map_name.count(key);//這個(gè)可以用來(lái)判斷某個(gè)數(shù)是否存在
map_name.find(key)!=map.end();//和上面一樣
map_name[key] = value;//插入某對(duì)鍵值對(duì)
map_name.erase(key);//刪除為key的鍵值對(duì)
< set >set_name.count(x);//這個(gè)可以用來(lái)判斷x是否存在
set_name.find(x)!=map.end();//和上面一樣
set_name.insert(x);//向set容器內(nèi)插入數(shù)據(jù)x
< pair >這沒(méi)啥,就相當(dāng)于下面的結(jié)構(gòu)體:
struct node{數(shù)據(jù)類(lèi)型 first;
數(shù)據(jù)類(lèi)型 second;
}
< string >string_name.substr(startIndex,length)//從startIndex下標(biāo)開(kāi)始截取length長(zhǎng)度的字符串
string_name.erase(pos)//刪除pos下表的字符
string_name.insert(pos,n,ch)//在pos處插入n個(gè)ch字符
??int res = stoi(string_name);//字符串轉(zhuǎn)換成十進(jìn)制
??string res = to_string(int val);//轉(zhuǎn)換成字符串里面可以是各種基本數(shù)據(jù)類(lèi)型的變量
string_name.c_str();//string與const char*指針之間了轉(zhuǎn)換
< vector >這個(gè)動(dòng)態(tài)數(shù)組就不說(shuō)了,沒(méi)啥需要特指的,還有stack和queue容器,這里不列舉。
< algorithm >stl
中的這個(gè)好用的函數(shù)太多了
max(x,y)
min(x,y)
swap(x,y)
abs(x)//x是整型的
reverse(it1,it2)//這里的it1和it2是指迭代器
fill()//填充
sort()
< cctype >isalpha()
isdigit()
islower()
isupper()
還有什么toupper、tolower這樣的,想轉(zhuǎn)換我們直接ch ^= 32;
用異或解決即可。
setw()//域?qū)?setfill()//域填充
setbase()//進(jìn)制
這里有倆好用的函數(shù),用于字符串匹配:
int sscanf(const char *str, const char *format, …)
int sprintf(char *str, const char *format, …)
sscanf
是將str
字符串轉(zhuǎn)換成對(duì)應(yīng)的數(shù)據(jù)的,是從左到右按字符串匹配得到轉(zhuǎn)換的操作;sprintf
是將數(shù)據(jù)轉(zhuǎn)換成字符串,是從右到左匹配的一個(gè)轉(zhuǎn)換操作;
如果使用這個(gè)想用到string
,那么可以使用string
中的c_str()
函數(shù),也可以對(duì)其進(jìn)行操作了。
#include#include#includeusing namespace std;
int main(){char ch;
string s,s1;
getline(cin,s);
double f = 0.0;
char x[10];
sscanf(s.c_str(),"%lf",&f);
cout<< f<< endl;
sprintf(x,"%.2lf",f);
cout<< x<< endl;
return 0;
}
輸入:
66
輸出:
66
66.00
輸入:
89.356
輸出:
89.356
89.36
輸入:
3.23
輸出:
3.23
3.23
注意:里面的首個(gè)參數(shù)是char*
指針,用string
時(shí)可以通過(guò)c_str()
函數(shù)使用sscanf
,而用sprintf
要用char
類(lèi)型數(shù)組。sscanf
和sprintf
成功的話會(huì)有返回值的,整型的,如果成功會(huì)返回1;
例子:
上面說(shuō)的倆函數(shù)是不能用的,to_string
可以轉(zhuǎn)換成string
類(lèi)型的,然后再調(diào)用c_str()
也是可以達(dá)到那個(gè)itoa
的效果的,所以不能用也沒(méi)關(guān)系。
cin
有些測(cè)試點(diǎn)就會(huì)出問(wèn)題了;你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧