C++快讀優化常數
快讀/快寫 的某版本:
// 快讀 typedef unsigned long long ull;inline ull q_read(){
ull x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
// 快寫
inline void write(int x){
char F[200];
int tmp=x>0?x:-x ;
if(x<0)putchar('-') ;
int cnt=0 ;
while(tmp>0)
{
F[cnt++]=tmp%10+'0';
tmp/=10;
}
while(cnt>0)putchar(F[--cnt]) ;
}
作用:
- 這個函式是什么作用呢?
相當于C語言的scanf("%d",&n);C++的cin>>n;
- C/C++到底快不快?
眾所周知,一個語言的速度,不能看他的函式或者方法到底寫了什么,要看他最終變成機器碼的指令條數;C/C++被稱為最快的語言(Go也其實很快),因為他是適合人閱讀的代碼,也接近于機器碼,所以才快!
- 大規模資料
對于一些大規模量資料的問題(10e5~~10e9)就不能用C++的cin>>了,因為C++的cin>>是給輸入流做了多載,而且C++的STL雖然解決了很多問題,底層架構很強,但是也很慢,業內人戲稱為大常數STL,不信你可以在使用queue<int>,map<int,string>試一試,中間的DEBUG程序經過了無數次的跳轉,會經過幾個頭檔案,這個常數和演算法無關!
關于PTA等OJ:
不同的OJ的判題有很多不同,比如:某谷就有O2優化,P某J是普通的演算法刷題,某code就讓你寫函式(方法),....專門考演算法的OJ對于這種O2快讀,優化不怎么在意,因為演算法不取決于語言,是靠你思想的;而浙大的PTA的某些試題,我們NEUQ的學子確實深受其毒,
- 首先:某些題目對輸入輸出有嚴格要求,比如你輸出多打了個空格,就會判錯
- 題目資料有些玄學:貌似是不同的人有不同的資料,比如:一道題別人做就是對的,你和他用的一個方法,甚至把代碼拿過來,也會判錯噢;還有些題目沒有資料范圍,讓人很難抉擇申請的陣列空間等,
- 最后是O2優化,可以看到,PTA上今晚的題目支持34中不同的語言,其中C/C++支持四種不同版本的編譯器,但不同的編譯器版本對應的原始碼大同小異,這對于C剛學了一年的人來說卻是難以抉擇,今晚第二道題目時間限制100MS,資料量10e5那么對應的
cin>>能過得去有些玄學,不過對于scanf("%d",&n);應該可以(我沒試),對于C++的快讀一定可以,第一次提交時間超限,那么寫了個快讀就可以過了,
如何優化C++的cin>>
某谷有中學生大佬這樣寫把CIN>>優化到和scanf大致一個速度,但資料量大了還是慢
#include <iostream>
using namespace std;
std::ios::sync_with_stdio(false);
關于C/C++的 _int64
有這樣一道題:給出兩個數字,求他們的和?求他們的乘積?
是不是很簡單?可以試一試
加法:https://www.luogu.com.cn/problem/P1601
乘法:https://www.luogu.com.cn/problem/P1303
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141553.html
標籤:C++
上一篇:關于C++的O2優化
