奇怪的笔记酱
//摘自洛谷:
//0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效)
//但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了
(写这些不重要的代码真的很痛苦)
//我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0
//现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!
//所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。
//http://blog.csdn.net/u011394362/article/details/39135107
浮点数处理
1.我们一般认为两个浮点数相等,当且当他们之间的误差不超过1e-8。
2.对于浮点数进行(int)转换时,计算机是只取整数部分的。
e.g.1.999999999转换为int就是1,所以
浮点数向int转换,会丢失精度。
为了避免这个,建议如果想取到整数部分。
可以使用
float b;
int a;
a=(b+0.5);
这样写的话,就是四舍五入。
如果写成a=b
可能有0.99999999999被截断,a就是0的情况。
字符串处理
1.string的find函数
如果说要find的字串不在str里面,该函数会返回string::npos,即-1。str.find("...."); 的返回值,不明白,应该也是一样。str.find("asdf"); 的返回值应该是0,即在str中的index位置。 found=str.find(str2);//found是str2在str中第一次出现的位置,找不到返回string::npos,即-1。
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define maxn 105 using namespace std; string a,b; int main() { cin>>a>>b; cout<<a.find(b)+1; puts(""); return 0; }
2.char的strstr()
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
#include<iostream> #include<cstring> using namespace std; int main() { char a[100],b[100]; cin>>a>>b; cout<<strstr(a,b)-a+1<<endl; return 0; }
3.字符串拆分至二维数组
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define maxn 1005 using namespace std; char s[maxn],a[105][105]; int main() { gets(s); int n=strlen(s); int k=0,j=0; for(int i=0;i<n;++i) { if(s[i]==' ') { k++; a[k][j]='\0'; j=0; continue; } a[k][j]=s[i]; j++; } for(int i=k;i>=0;--i)cout<<a[i]<<" "; puts(""); return 0; }
数论
对于整数p q,有p*q==gcd(p,q)*lcm(p,q)
设s=lcm(p,q)/gcd(p,q)==y0/x0;
则s=p*q/gcd(p,q)^2
因为p/gcd(p,q)与q/gcd(p,q)互质,所以问题转化成了找一组x,y,使得x*y==s(x*y==y0/x0)且gcd(x,y)==1