『嗨威说』常见的C++函数模板整理(一)
开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈。记得今天奶奶生日,很开心地给奶奶打了一通电话,这怕是我第一次给奶奶电话送生日祝福了哈哈哈,是啊,很想珍惜身边的人,但很多时候却一心想提高自己地能力而忽视了身边人,就这四年,就这四年好好提升自己,毕业出来一定要好好陪陪家里祖辈亲戚们。
今天有点特殊,我整理了一下学到这么久编程以来的一些模板和技巧,虽然还没整理完,就作为(一)吧,后面会慢慢更新(其实是今天解不出难题哭了,一天一道acm都要死了,可能自己训练量和能力远远不够吧,所以渣渣了,努力努力!)
今日推荐:
今天心情很糟糕,每次心情很烂的时候总会去听听自己最最最喜欢的歌曲没有之一,去激励自己走出烂心情,希望读到这篇博客的读者们,也能轻松摆脱自己的烂心情,笑对人生~
《于是》 - 邓紫棋
既然回不去了 我还在烦恼什么于是告诉自己不要哭我不要哭 我不能哭往前方的路走一步再走一步 就会幸福成长要学会独处虽然有一点孤独链接:https://music.163.com/#/song?id=36198060&autoplay=true&market=baiduhd
(-> 001)分割数值(倒序输出)模板:
#include<iostream> using namespace std; int main() { int num,k; cin >> num; while(num>0) { k = num % 10; cout<<k<<" "; num = num / 10; } }
(-> 002)求a、b的最大公约数:
法一:
long long gcd(long long m, long long n) { return (m==0)?n:gcd(n%m, m); }
法二:
int gcd(int big, int small) { if (small > big) swap(big, small); int temp; while (small != 0){ // 辗转相除法 if (small > big) swap(big, small); temp = big % small; big = small; small = temp; } return(big); }
(-> 003)求a与b的最小公倍数。 与上面函数配合使用。
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
(-> 004)判断素数的方法:
法一:
bool sushu(int num) { int sqrto,test = 0; sqrto = sqrt(num); for(int i = 2;i<=sqrto;i++) { if(num%i==0) break; else test++; } if(test == (sqrto -1)) return 1; else return 0; }
法二:
bool judge(int x){ for(int i=2;i<sqrt(x);i++) if(x%i==0) return false; return true; }
(-> 005)全排列输出:
void pern(int list[], int k, int n) { // k表示前k个数不动仅移动后面n-k位数 if (k == n - 1) { for (int i = 0; i < n; i++) { printf("%d", list[i]); } printf("\n"); }else { for (int i = k; i < n; i++) { // 输出的是满足移动条件所有全排列 swap(list[k], list[i]); pern(list, k + 1, n); swap(list[k], list[i]); } } }
(-> 006)向量工具:
struct node { double x; // 横坐标 double y; // 纵坐标 }; typedef node vector; vector operator + (vector a, vector b) { return vector(a.x + b.x, a.y + b.y); } vector operator - (point a, point b) { return vector(a.x - b.y, a.y - b.y); } vector operator * (vector a, double p) { return vector(a.x*p, a.y*p); } vector operator / (vector a, double p) { return vector(a.x / p, a.y*p); } double dot(vector a, vector b) { return a.x*b.x + a.y*b.y; } // 向量点乘 double length(vector a) { return sqrt(dot(a, a)); } // 向量模长 double angle(vector a, vector b) { return acos(dot(a, b) / length(a) / length(b)); } // 向量之间夹角 double cross(vector a, vector b) { // 叉积计算 公式 return a.x*b.y - a.y*b.x; } vector rotate(vector a, double rad) // 向量旋转 公式 { return vector(a.x*cos(rad) - a.y*sin(rad), a.x*sin(rad) + a.y*cos(rad)); } point getlineintersection(point p, vector v, point q, vector w) { // 两直线交点t1 t2计算公式 vector u = p - q; double t = cross(w, u) / cross(v, w); // 求得是横坐标 return p + v*t; // 返回一个点 }
(-> 007)组合公式:
long long int c(int m,int n) { int k=1;//相当于c(m,n) long long int ans=1; while(k<=n) { ans=((m-k+1)*ans)/k; k++; } return ans; }
(-> 008)大数阶乘公式:
string bigfactorial(int n){ int ans[maxn],digit = 1; ans[0] = 1; for(int i = 2; i <= n; i++){ int num = 0; for(int j = 0; j < digit; j++){ int temp = ans[j]*i + num; ans[j] = temp%10; num = temp/10; } while(num != 0){ ans[digit] = num%10; num /= 10; digit++; } } string str = ""; for(int i = digit-1; i >= 0; i--) str += ans[i] + '0'; return str; }
(-> 009)杨辉三角打印:
#include<iostream> #include<cstdlib> using namespace std; long long int s=1; long long int h,i,j; int main() { while(cin>>h) { cout<<"1"<<endl; for (i = 2; i <= h; s= 1, i++) { cout<<"1 "; for (j = 1; j <= i - 2; j++) { cout<<(s = (i - j) * s / j)<<" "; } cout<<"1"<<endl; } cout<<endl; } return 0; }
(-> 010)其他整理:
1、char c1,c2,c3的int型即为ascii码
2、cout << setprecision(2) << fixed << 固定精度输出
3、printf("%.2lf\n",num)用于输出double类型数据并固定精度
4、获取需要空格输入的段落:
char a[100]; cin.getline(a, 100)
5、数组a[100]的清零操作 memset(a,0,sizeof(a));
6、 getchar();//把回车符吃掉,否则下一句会出错
gets(a); //读取整行
length=strlen(a); //获得长度
前阵子的一些小模板,积累了起来,贴在博客就方便自己或者有需要的人使用啦~ 我会继续更新这些比较实用常用的小模板呢~ 如有错误,希望评论指正哟~ 互相帮助才能更加成长~