欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

『嗨威说』常见的C++函数模板整理(一)

程序员文章站 2022-04-28 11:54:12
开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈。记得今天奶奶生日,很开心地给奶奶打了一通电话,这怕是我第一次给奶奶电话送生日祝福了哈哈哈,是啊,很想珍惜身边的人,但很多时 ......

  开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈。记得今天奶奶生日,很开心地给奶奶打了一通电话,这怕是我第一次给奶奶电话送生日祝福了哈哈哈,是啊,很想珍惜身边的人,但很多时候却一心想提高自己地能力而忽视了身边人,就这四年,就这四年好好提升自己,毕业出来一定要好好陪陪家里祖辈亲戚们。

  今天有点特殊,我整理了一下学到这么久编程以来的一些模板和技巧,虽然还没整理完,就作为(一)吧,后面会慢慢更新(其实是今天解不出难题哭了,一天一道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); //获得长度

 

 

   前阵子的一些小模板,积累了起来,贴在博客就方便自己或者有需要的人使用啦~ 我会继续更新这些比较实用常用的小模板呢~ 如有错误,希望评论指正哟~ 互相帮助才能更加成长~