wenbao与acm技巧(必备知识)
推荐博客:http://blog.csdn.net/xueerfei008/article/details/19029797 http://blog.csdn.net/xueerfei008/article/details/11834011
计算一个数中一的个数
1 cout<<__builtin_popcount(7);
提高速度
1 std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
程序运行时间
1 #include <stdio.h> 2 #include <time.h> 3 int main() { 4 clock_t start = clock(); 5 6 // Place your codes here... 7 for(int i = 0; i < 10000000; ++i){ 8 for(int j = 0; j < 100; ++j); 9 } 10 11 clock_t ends = clock(); 12 13 printf("Running Time :%lf\n", (ends - start) / CLOCKS_PER_SEC * 1000.0); 14 15 return 0; 16 }
哎。。忘记是求什么的了
(n*m-1)/(m-1)
1*n+2*(n-1)+3*(n-2)+…+n*1=n(n+1)(n+2)/6
1+2+3+…+n=n(n+1)/2
1²+2²+3²…+n²=n(n+1)(2n+1)/6
1³+2³+3³+…n³=n²(n+1)²/4=[n(n+1)/2]²
1^4+2^4+3^4+...+n^4=n(n+1)(2n+1)(3n^2+3n-1)/30
1*2+2*3+3*4+4*5+…+n(n+1)=n(n+1)(n+2)/3
PI值
const double PI = acos(-1.0);
@关于for:
1 //处理字符串的时候可以这样写———— 2 for(int i = 0; str[i]; i++) 3 4 //但是处理数组只能这样写(不然多组输入的时候会有问题出现,应为memse只是清除字符串的t) 5 for(int i = 0; i < n; i++)
输出到文本
1 #include <iostream> 2 using namespace std; 3 int main(){ 4 freopen("in.txt", "r", stdin); 5 freopen("out.txt", "w",stdout); 6 int a,b; 7 while(cin>>a>>b) cout<<a+b<<"\n"; 8 }
1 #include <fstream> 2 using namespace std; 3 ifstream fin("abc.txt"); 4 ofstream fout("abcd.txt"); 5 int main(){ 6 int a,b; 7 while(fin>>a>>b) fout<<a+b<<"\n"; 8 return 0; 9 }
@ 关于memset
大牛博客:http://www.cnblogs.com/LLGemini/p/4309660.html
1 memset是用于字符串处理的,不再多说,那么处理int数组怎么办呢?要怎样处理呢? 2 // *******char 是一个字节而int是四个字节 3 memset(a, 0, sizeof(a)); // 正确 4 memset(a, 1, sizeof(1)); // 错误,字节问题初始化的值为:16843009 5 int型的最大值为 0x7f,所以可以 memset(a, 0x7f, sizeof(a)); 初始化为最大值,但是非常容易爆int; 6 最精巧的无穷大常量取值是0x3f3f3f3f,0x3f3f3f3f的十进制是1061109567,也就是10^9级别的,0x3f3f3f3f+0x3f3f3f3f=2122219134,没有爆int; 7 8 所以说0x3f3f3f3f是最棒的选择 9 0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要 10 memset(a,0x3f,sizeof(a)); 11 12 其他赋值: 13 memset(arr,0x7F,sizeof(arr)); //它将arr中的值全部赋为2139062143,这是用memset对int赋值所能达到的最大值 14 memset(arr,0x80,sizeof(arr)); //set int to -2139062144 15 memset(arr,0x7F,sizeof(arr)); //set double to 1.38242e+306 16 memset(arr,0xFE,sizeof(arr)); //set double to -5.31401e+303
@ int long long int 范围
1 unsigned int 0~4294967295 0 ~ 4*10^9; 2 int -2147483648~2147483647 -1*2*10^9 ~ 2*10^9; 3 unsigned long 0~4294967295 0 ~ 4*10^9; 4 long -2147483648~2147483647 -1*2*10^9 ~ 2*10^9; 5 long long的最大值:9223372036854775807 9*10^18; 6 long long的最小值:-9223372036854775808 -1*9*10^18; 7 unsigned long long的最大值:18446744073709551615 1*10^19; 8 9 __int64的最大值:9223372036854775807 9*10^18; 10 __int64的最小值:-9223372036854775808 -1*9*10^18; 11 unsigned __int64的最大值:18446744073709551615 1*10^19;
@ 用c++11编译
g++ -std=c++11 y.cpp -o y
@ 强制转化
1LL
@ n的阶乘的位数
@@ 斯特林公式
更加精确的近似公式为:
其中
利用斯特林(Stirling)公式求解n!的位数:
易知整数n的位数为[lg10(n)]+1.
用Stirling公式计算n!结果的位数时,可以两边取对数,得:
log10(n!) = log10(2*PI*n)/2+n*log10(n/E);
故n!的位数为
res=log10(2*PI*n)/2+n*log10(n/E)+1
或者为:
long result = (long)((log10(sqrt(4.0*acos(0.0)*n))+n*(log10(n)-log10(exp(1.0))))+1); (编程更方便)
(注意:当n=1时,算得的结果为0)
n!的估计:
在高德纳的《计算机程序设计艺术》一书中,对n!的估计:
n! = sqrt(2*π*n) * ((n/e)^n) * (1 + 1/(12*n) + 1/(288*n*n) + O(1/n^3));
x = log10N!
long result = (long)((log10(sqrt(4.0*acos(0.0)*n))+n*(log10(n)-log10(exp(1.0))))+1);
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int main(){ 5 int n, t; 6 cin >>t; 7 while(t--){ 8 cin>>n; 9 if(n==1) cout<<1<<endl; 10 else{ 11 long result = (long)((log10(sqrt(4.0*acos(0.0)*n))+n*(log10(n)-log10(exp(1.0))))+1); 12 cout<<result<<endl; 13 } 14 } 15 return 0; 16 }
@ memcpy函数
memcpy(a, b, sizeof(a));
将b赋值给a,b是源
@ 必备数学知识
大牛博客:http://blog.sina.com.cn/u/2056445344
求与 y=-x-1, y=x-1, y=0 三条直线相切的抛物线的方程
三角形垂心坐标公式
三角形重心坐标公式及欧拉线
平面三角形外心坐标公式
平面三角形内心坐标公式
注:若在上述去绝对值时,适当地变动符号,可以推是其他三个旁心坐标公式。实质上内心与旁心是一样的!旁心是内心的延伸,内心是到三边所对应的线段,而旁心是三边所对应的直线。
斐波那契额数列
字符输入
1 char read(){ 2 char ch; 3 for(;;){ 4 ch = getchar(); 5 if(ch >= 'A' && ch <= 'Z') return ch; 6 } 7 }
for循环
1 #define REP(i, n) for(int i = 0; i < n; i++)
组合数学
1 C(n+1, k+1) = C(n, k) + C(n, k+1)
2 C(n, k+1) = C(n, k)*(n-k)/(k+1)
只有不断学习才能进步!