钓起来的tips系列
●求n的阶乘:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int jc(int k) 5 { 6 if(k==1)return 1; 7 else return jc(k-1)*k; 8 } 9 10 /*int jc(int k) 11 { //我自己不太喜欢的一种写法_(:3z)__ 12 int x; 13 if(k==1)x=1; 14 else x=k*jc(k-1); 15 return x; 16 }*/ 17 18 int main() 19 { 20 cin>>n; 21 cout<<jc(n); 22 return 0; 23 }
●~scanf的作用
位运算以达到控制循环的作用
https://blog.csdn.net/wtyvhreal/article/details/42006055(写得很好的一篇qwq)
●数学香瓜
- 要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在 每步计算之后对n取余,结果不变。
●乱七八糟
- scanf只能一个一个读单词,不读空格
- sort形式:sort(first_pointer,first_pointer+n,cmp) //没有cmp比较函数就默认升序排列
- while(scanf("%s",&st)==1)输入神用
-
cin/cout之所以慢,是因为它多了和STDIO同步的过程,因此我们只需要把这个同步关系禁用就可以了,为了禁用这个同步关系,我们需要在main()函数开头加上以下代码:
ios::sync_with_stdio(false);
如此一来,同步关系就被禁用了,当然副作用是无法再使用scanf/printf。
- 【判断素数改进版】
int is_prime(int x) { if(x<=0)return 0; int m=floor(sart(x)+0.5); for(int i=2;i<x;i++) if(x%i==0)return 0; return 1; }
●前綴和
- 听老师讲搜索和dp时总听到前缀和blabla,一直搞不懂,当然要查查啦!
- 引自K_rew的博客:https://blog.csdn.net/K_rew/article/details/50527287
一维前缀和
这个优化主要是用来在O(1)时间内求出一个序列a中,a[i]+a[i+1]+……+a[j]的和。具体原理十分简单:用sum[i]表示(a[1]+a[2]+……+a[i]),其中sum[0]=0,则(a[i]+a[i+1]+……+a[j])即等于sum[j]-sum[i-1]。
二维前缀和
同理,有一维就有二维。对于一个矩阵a,我们也能在O(1)时间内求出子矩阵[x1~x2][y1~y2]的和。设sum[i][j]为子矩阵[1~i][1~j]的和。则由容斥原理得:
sum[0][j]=sum[i][0]=0
a[x1~x2][y1~y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]
- c++输入输出流
sprintf妙啊!
-
代码来源:https://blog.csdn.net/jllongbell/article/details/79092891
int main(){ char str[256] = { 0 }; int data = 1024; //将data转换为字符串 sprintf(str,"%d",data); //获取data的十六进制 sprintf(str,"0x%X",data); //获取data的八进制 sprintf(str,"0%o",data); const char *s1 = "Hello"; const char *s2 = "World"; //连接字符串s1和s2 sprintf(str,"%s %s",s1,s2); cout<<str<<endl; return 0; }
2.但是!更妙的是这个stringstream啊!
stringstream被群里dalao嘲讽了…_(:3/_)__我不管我就觉得他好用哼
https://blog.csdn.net/qq_28114615/article/details/85778797
(lrj大佬:可以把string作为流进行读写,定义在sstream头文件中。 虽然string和sstream都很方便,但string很慢,sstream更慢,应谨慎使用)
- cin>>t有时候比while啥玩意快的,详细可以看机器翻译那道题的提交记录……
- #define For(i,l,r) for (register int i=l; i<=r; i++) 压行快乐
- int本来就是signed int,int = signed int = signed 有时候直接 #define int long long 了,就要把int main改成signed main
- __builtin_popcount计算二进制某数中1的个数