所有的計算最后都是轉換成二進制進行計算的,所以浮點計算時候,有時會出現(xiàn)精度流失的問題。
解決方法:
盡量轉換成long型計算,最后再換成浮點型輸出結果。
查詢數(shù)據(jù)是否存在刷題時候測試點也不一定會考察這方面,但當很多個浮點型數(shù)據(jù)運算時候丟失精度就更明顯了。當題目中告訴我們每個數(shù)的小數(shù)點最高幾位的時候,我們還是最好先轉換成long型最后再換回來,這樣更為準確。
如果可以在set和map中進行查詢find,就別在vector容器中查詢用find,因為vector中的find的algorithm的find,時間復雜度是O(n),而set和map是自帶的函數(shù),內部結構是紅黑樹。
但是如果是set和map的話,用count就可以了,因為他們內部都不是重復的。時間復雜度和find一樣是(logn);
用map.count(key)是否大于0查找數(shù)據(jù)應該是用的比較多的。
有時需要把答案放在容器內,然后把所寫的放另一個容器里,比較是否與答案相等,這個時候就有必要用到容器之間是否相等。
容器之間比較內部所有元素是否相等,可以直接用**==**
如果兩個容器的長度相同且對應位置元素都相等,則兩個容器就相等,否則不等。
和Java
中重寫equals
后用equals
方法有點像。
使用cin
輸入數(shù)據(jù)后,會殘留空格或者回車符在緩存區(qū)中;
使用getline
輸入數(shù)據(jù)后,不會有回車在緩存區(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)需要處理字符的原因:
是因為cin
遇到空格或者回車字符時,是作為結束符的,但是其本身還是存留在緩沖中,遇到要么作為結束符要么就是直接跳過。既然在緩沖中,如果不需要就需要將其除去;
解決方法:
cin
肯定是比scanf
方便的,但有很多時候還是用scanf
比較的好。
比如要輸入年:月:日
用cin
肯定是不好實現(xiàn)的,用scanf("%d:%d:%d",&year,&month,&day);
肯定會方便簡潔。
并且學會輸入數(shù)據(jù)的同時,處理數(shù)據(jù),這樣可以達到簡潔代碼,防止代碼重復。
下面就是個好例子:
使用數(shù)組達到hash
的目的是比使用map
要方便很多的,我們可以利用它的索引以及對應的值表示不同的含義。
比如:
索引表示學號,值表示排名;
索引表示學號,值表示是否存在;
索引表示時間,值表示數(shù)據(jù)量;
索引表示某字符的ASCII碼,值表示是否存在等等。
通過hash數(shù)組,可以讓我們查詢結果更快,效率更高!
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ù)a和b,大公約數(shù)gcd
和最小公倍數(shù)lcm
的乘積應該為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);
}
}
常用的頭文件及其內部函數(shù)只說用的部分函數(shù),咋用這里木得
< map >map_name.count(key);//這個可以用來判斷某個數(shù)是否存在
map_name.find(key)!=map.end();//和上面一樣
map_name[key] = value;//插入某對鍵值對
map_name.erase(key);//刪除為key的鍵值對
< set >set_name.count(x);//這個可以用來判斷x是否存在
set_name.find(x)!=map.end();//和上面一樣
set_name.insert(x);//向set容器內插入數(shù)據(jù)x
< pair >這沒啥,就相當于下面的結構體:
struct node{數(shù)據(jù)類型 first;
數(shù)據(jù)類型 second;
}
< string >string_name.substr(startIndex,length)//從startIndex下標開始截取length長度的字符串
string_name.erase(pos)//刪除pos下表的字符
string_name.insert(pos,n,ch)//在pos處插入n個ch字符
??int res = stoi(string_name);//字符串轉換成十進制
??string res = to_string(int val);//轉換成字符串里面可以是各種基本數(shù)據(jù)類型的變量
string_name.c_str();//string與const char*指針之間了轉換
< vector >這個動態(tài)數(shù)組就不說了,沒啥需要特指的,還有stack和queue容器,這里不列舉。
< algorithm >stl
中的這個好用的函數(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這樣的,想轉換我們直接ch ^= 32;
用異或解決即可。
setw()//域寬
setfill()//域填充
setbase()//進制
這里有倆好用的函數(shù),用于字符串匹配:
int sscanf(const char *str, const char *format, …)
int sprintf(char *str, const char *format, …)
sscanf
是將str
字符串轉換成對應的數(shù)據(jù)的,是從左到右按字符串匹配得到轉換的操作;sprintf
是將數(shù)據(jù)轉換成字符串,是從右到左匹配的一個轉換操作;
如果使用這個想用到string
,那么可以使用string
中的c_str()
函數(shù),也可以對其進行操作了。
#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
注意:里面的首個參數(shù)是char*
指針,用string
時可以通過c_str()
函數(shù)使用sscanf
,而用sprintf
要用char
類型數(shù)組。sscanf
和sprintf
成功的話會有返回值的,整型的,如果成功會返回1;
例子:
上面說的倆函數(shù)是不能用的,to_string
可以轉換成string
類型的,然后再調用c_str()
也是可以達到那個itoa
的效果的,所以不能用也沒關系。
cin
有些測試點就會出問題了;你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當前文章:【PAT乙級】一百一十道真題刷后大匯總——C/C++-創(chuàng)新互聯(lián)
當前URL:http://chinadenli.net/article42/deeeec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、響應式網(wǎng)站、標簽優(yōu)化、自適應網(wǎng)站、App設計、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容