问题标题: c++之模板(前期出处@李牧晓)

3
5
已解决
孟昭旭
孟昭旭
初级光能
初级光能

纯纯萌新,请多关照

1.闰年判断

bool leapyear(int year){ //判断year是否为闰年,是返回true,不是返回false
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        return true;
    else
        return false;
}

2.素数判断

int prime(int n){ //判断n是否为素数,是返回1,不是返回0 
    for (int i = 2; i <=sqrt (n); i++)  
        if (n%i == 0)
           return 0; 
    return 1;
}

3.回文数判断

int f(int n){//判断n是否是回文数,是返回1,否则返回0
    int t=0,m=n;
    while(m) {//如果m不等于0,执行下面循环,否则跳出循环 (求这个数各位上数字反向排列的数 ) 
        t*=10;
        t+=m%10;
        m/=10;
    }
    return t==n;//如果这个数各位数字反向排列所得数依然等于该数,该数就是回文数 
}

勿**

孟昭旭在2022-08-09 20:14:57追加了内容

@万韧山 @陈雨泽 感谢指出

判断回文(双指针)

bool hw(int n){
    int a[100],cnt=0;
    while(n!=0){
        a[++cnt]=n%10;
        n/=10;
    }
    int i=1;
    while(i<=cnt){
        if(a[i]!=a[cnt]) return 0;
        i++;
        cnt--;
    }
    return 1;
}

想不到吧我还有一种方法 判断回文数/串

int fun(string a) {
//判断字符串a是否是回文串,是返回1,否则返回0。也适用于判断数字是否回文数 
	int flag=1;
    int len=a.size();
	for(int i=0;i<=len/2;i++)	{
		if(a[i]!=a[len-i-1]) 	{
			flag=0;
			break;
		}
    }
    return flag;
}

@万韧山 感谢补充

最大公约数与最小公倍数

int gcd(int x,int y){ //用辗转相除法,求x和y的最大公约数
	if(x<y){ //保证两个数的x>y 
		int t=x;
		x=y;
		y=t;
	}
    int r;
    while(y>0)    {
        r=x%y;
        x=y;
        y=r;
    }
    return x;
}

int lcm(int x,int y){ //求x和y的最小公倍数
	return x*y/gcd(x,y);
} 

 

孟昭旭在2022-08-26 19:38:02追加了内容

@李牧晓 

额。。。。。。

我现在就结贴好叭


0
已采纳
李牧晓
李牧晓
中级天翼
中级天翼

我要以下回答

1、是不是从我这借鉴的灵感创作的这个帖?

2、有没有想过标明出处?

3、有没有翻过以前的帖查看有没有相同的?

我是第一次被模仿 可能要求有点多 请见谅

1
万韧山
万韧山
初级天翼
初级天翼

补充一下回文数的另一个模板

是判断的

bool hw(int n){
    int a[100],cnt=0;
    while(n!=0){
        a[++cnt]=n%10;
        n/=10;
    }
    int i=1;
    while(i<=cnt){
        if(a[i]!=a[cnt]) return 0;
        i++;
        cnt--;
    }
    return 1;
}

最大公约数

long long gcd(long long a,long long b){
    long long r;
    while(b!=0)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}

 

1
陈雨泽
陈雨泽
资深光能
资深光能

bool hw(string s) {

int l=0,r=s.size()-1;

while(l<r) {

if(s[l]!=s[r])

return false;

l++; r--; }

return true; }

1
潘登
潘登
高级天翼
高级天翼

素数也可用埃氏筛法(建议加上)

1
陈则霖
陈则霖
资深光能
资深光能

两个坐标点之间的直线距离:

头文件:#include<cstdio>
函数部分:
int zxjl(int a,int b,int c,int d)
{
    return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}

可能有错,因为是纯现打

赶紧补充上

ps支持,但是你还有好多没有补上,比如深度优先搜索,广度优先搜索,01背包,还有最基**的文件操作,(当然,还有很多。)有很多很重要的建议赶快补上。就这样了。

0
李醒
李醒
新手光能
新手光能

我觉得你可以像扫地僧申精了

0
李牧晓
李牧晓
中级天翼
中级天翼

@万韧山  没有没有只是被抄袭了想要一个说法而已~

0
陈雨泽
陈雨泽
资深光能
资深光能

还有:判断是否为回文串时,可以使用**双指针**的方法

0
李显晨
李显晨
中级启示者
中级启示者

图论之最短路径算法模板:

Floyd:

memset(dis,0x3f,sizeof(dis));
for(int i=1; i<=m; i++) dis[u][v] = dis[v][u] = w;
for(int k=1; k<=n; k++)
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);

Dijkstra:

    1.不优化:

void Dijkstra(int s) {
    memset(found, false, sizeof(found));
    memset(dis, 0x3f, sizeof(dis));
    dis[s] = 0;
    while(true) {
        int u = -1;
        for(int i=1; i<=n; i++)
            if(!found[i]&&(u==-1||dis[i]<dis[u])) u = i;
        if(u==-1)   return;
        found[u] = true;
        for(int i=1; i<=n; i++) dis[i] = min(dis[i], dis[u]+cost[u][i]);
    }
}

    2.堆优化

void dijkstra(int st){
    memset(dis,0x3f,sizeof(dis));
    q.push(P(st,0));
    dis[st]=0;
    while(!q.empty()){
        P h=q.top(); q.pop();
        int u=h.first;
        if(dis[u]<h.second) continue;
// 小根堆里的队首元素 是最小值,如果满足此条件说明已经被更新过了,就不需要再更新。
        dis[u]=h.second;
        for(int i=0;i<g[u].size();i++){
            edge e=g[u][i];
            if(dis[e.next]>dis[u]+e.w){
                dis[e.next]=dis[u]+e.w;
                q.push(P(e.next,dis[e.next]));
            }
        }
    }
}

3.Prim:

int MST_prim(){
    int ans=0;
    memset(dis,0x3f,sizeof(dis));
    memset(found,false,sizeof(found));
    dis[1]=0;
    while(1){
        int u=-1;
        for(int i=0;i<=n;i++){
            if(!found[i]&&(u==-1||dis[i]<dis[u])) u=i;
        }
        if(u==-1) break;
        found[u]=true;
        ans+=dis[u];
        for(int i=0;i<=n;i++){
            if(!found[i]&&g[u][i]<dis[i]) dis[i]=g[u][i];
        }
    }
    return ans;
}

4.Kruscal

bool cmp(node x,node y){
    return x.w<y.w;
}
void init(){
    for(int i=1;i<=n;i++)
        fa[i]=i;
} 
int find(int x){
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}
void unite(int x,int y){
    x=find(x);
    y=find(y);
    if(x==y) return ;
    fa[x]=y;
}
bool same(int x,int y){
    return find(x)==find(y);
}
int main(){
    cin>>n>>m>>k;
    for(int i=1,u,v,w;i<=m;i++){
        cin>>u>>v>>w;
        a[i]=(node){u,v,w};
    }
    sort(a+1,a+1+m,cmp);
    init();
    for(int i=1;i<=m;i++){
        if(!same(a[i].u,a[i].v)){
            unite(a[i].u,a[i].v);
            ans+=a[i].w;
            cnt++;
        }
        if(按题意来) break;
    }
    if(按题意来) cout<<"No Answer";    
    else cout<<ans;
}

5.Ford:

bool Ford(int s) {
    memset(dis, 0x3f, sizeof(dis));
    dis[s] = 0;
    for(int i=1; i<n; i++)
        for(int j=1; j<=n; j++)
            for(int k=0; k<g[j].size(); k++) {
                edge e = g[j][k];
                dis[e.adj] = min(dis[e.adj], dis[j]+e.w);
            }
    for(int i=1; i<=n; i++)
        for(int j=0; j<g[i].size(); j++) {
            edge e = g[i][j];
            if(dis[e.adj]>dis[i]+e.w) return false;
        }
    return true;
}

6.SPFA(不稳定,一般不要使用)

void SPFA(int s) {
    memset(dis, 0x3f, sizeof(dis));
    memset(exist, false, sizeof(exist));
    dis[s] = 0;
    q.push(s);
    exist[s] = true;
    while(!q.empty()) {
        int h = q.front();
        q.pop();
        exist[h] = false;
        for(int i=0; i<g[h].size(); i++) {
            edge e = g[h][i];
            if(dis[e.nxt]>dis[h]+e.w) {
                dis[e.nxt] = dis[h]+e.w;
                if(!exist[e.nxt]) {
                    q.push(e.nxt);
                    exist[e.nxt] = true;
                }
            }
        }
    }
}

 

0
汪宇航
汪宇航
新手启示者
新手启示者

...这...确实挺**的

bfs模板:

while(!q.empty()){
        int h=q.front();
        ++pp;
        if(h+g[h]<=n && !vis[h+g[h]]){
            cnt[h+g[h]]=cnt[h]+1;
            vis[h+g[h]]=true;
            q.push(h+g[h]);
        }
        if(h-g[h]>0 && !vis[h-g[h]]){
            cnt[h-g[h]]=cnt[h]+1;
            vis[h-g[h]]=true;
            q.push(h-g[h]);
        }
        q.pop();
    }

求解转判定模板:

while(l<r){
        int mid=(l+r)/2;
        if(ch(mid))r=mid;
        else l=mid+1;
    }
    return l;

最长公共子序列模板:

for(int i=1;i<=la;i++)
        for(int j=1;j<=lb;j++){
            if(a[i]==b[j]){
                f[i][j]=f[i-1][j-1]+1;
                g[i][j]=1;
            }else{
                if(f[i-1][j]>f[i][j-1]){
                    f[i][j]=f[i-1][j];
                    g[i][j]=3;
                }else{
                    f[i][j]=f[i][j-1];
                    g[i][j]=2;
                }
            }
        }

最长不下降子序列模板:

for(int i=1;i<=n;i++){
        f[i]=1;
        for(int j=1;j<i;j++){
            if(a[j]>=a[i]){
                f[i]=max(f[i],f[j]+1);
            }
        }
        ans=max(ans,f[i]);
    }

最大连续子序列和模板:

#include<bits/stdc++.h>
using namespace std;
int n,a[100005],f[100005],t;
int main(){
    cin>>t;
    while(t--){
        cin>>n;
        int mx=-2147483647;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            f[i]=max(f[i-1]+a[i],a[i]);
            mx=max(mx,f[i]);
        }
        cout<<mx<<"\n";
    }
    return 0;
}

前缀和模板:

while(n--){
        cin>>a;
        p+=a;
        cout<<p<<"\n";
    }

 

我要回答