栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

一些小技巧(真的很小)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一些小技巧(真的很小)

1. 函数:(前面都是基础,后面的才好看)

目录

1. 函数:(前面都是基础,后面的才好看)

1)库函数:

2)自定义函数:自己编写的函数,不可与库函数重名,命名规则同变量、数组等

__________________________________

2. 结构体:将不同类型的变量(或数组)“捆绑到一起”

1)声明格式:

2)应用结构体

__________________________________

3. 常用技巧:

1)辗转相除法:

________________

2)快速幂:

________________

3)埃氏筛法:

__________________________________

4. 高精度算法(几个模板):

1) 高精度加法:

__________________________________

2) 高精度减法:

__________________________________

3) 高精度乘法:

__________________________________

4) 高精度除法:

__________________________________

5. 位运算:

注:负数以补码形式参与位运算

__________________________________

6. 贪心算法;

__________________________________

7. 递推算法:


1)库函数:

c++自带函数,使用时对应不同头文件:e.g strlen函数使用

#include< string >

2)自定义函数:自己编写的函数,不可与库函数重名,命名规则同变量、数组等

格式: 函数类型 (函数所需参数)

{

函数内容;

return 返回内容 ;

}//注:函数类型可以没有,即为void,此时没有“return”

__________________________________

2. 结构体:将不同类型的变量(或数组)“捆绑到一起”

1)声明格式:

struct 结构体名{

结构体内容类型 结构体内容名;

……

}变量;//注意分号;

2)应用结构体

A.函数中的应用:函数名(结构体名 变量名)

B.主函数的应用:变量.结构体内容名

e.g

struct f{

char name[100];

int age;

}r[100];

int cmp(f a,f b)

{

return a.age>=b.age;//按年龄从大到小排序

}

__________________________________

3. 常用技巧:

1)辗转相除法:
​#include
using namespace std;
int gcd(int a,int b)//求a与b的最大公因数
{
	while(b>0)
	{
		int r=a%b;
		a=b;
		b=r;
	}
	return a;
}

​

________________

2)快速幂:

核心:让底数最大;算一次模一次,防止溢出

​#include< bits/stdc++.h >
using namespace std;
long long f(long long a,long long n,long long mod)
//求a的b次方对于mod取模的结果
{
	long long ans=1;
	a= a % mod;
	while(n)
	{
		if(n%2)
		{
			ans*=a;
			ans%=mod;
		}
		a=a*a;
		a=a%mod;
		n=n/2; 
	}
	return ans%mod;
}

​
________________

3)埃氏筛法:

核心:避免重复筛查

​#include
using namespace std;
int main()
{
    int m,n,ans=0;
  	//求m与n之间质数(素数)的个数
    scanf("%d %d",&m,&n);
    int pd[n];
    for(int i=0;i=m){
                printf("%d ",i);
                ans++;
            }
            for(int l=2*i;l<=n;l=l+i)
            {
                pd[l]=1;
            }
        }
    }
    printf("n%d",ans);
    return 0;
}

​
__________________________________

4. 高精度算法(几个模板):

1) 高精度加法:
#include
using namespace std;
int main()
{
	char a[5050],b[5050],aa[5050],bb[5050],ans[5050];//定义
	for(int i=0;i<5050;i++)//初始化
	{
		a[i]=0;
        b[i]=0;
        aa[i]=0;
        bb[i]=0;
        ans[i]=0;
	}
	scanf("%s %s",a,b);//输入
	for(int i=strlen(a)-1,l=0;i>=0;i--,l++)
	{
		aa[l]=a[i]-'0';//转换成数组并逆序存入
	}
	for(int i=strlen(b)-1,l=0;i>=0;i--,l++)
	{
		bb[l]=b[i]-'0';//转换成数组并逆序存入
	}
	int p=max(strlen(a),strlen(b)),x=0;//计算答案大小
	for(int i=0;i=10)//计算进位
		{
			x=1;
			ans[i]=ans[i]-10;
		}
	}
	for(int i=p;i>=0;i--)//删除补位零
	{
		if(i==p&&ans[i]==0)
		{
			i--;
		}
		printf("%d",ans[i]);//输出答案
	}
  return 0;
}
__________________________________

2) 高精度减法:
#include
using namespace std;
int main()
{
	char a[5050],b[5050],aa[5050],bb[5050],ans[5050];
	for(int i=0;i<5050;i++)//初始化
	{
		a[i]=0;
      	b[i]=0;
      	aa[i]=0;
      	bb[i]=0;
      	ans[i]=0;
	}
	scanf("%s %s",a,b);//输入数据
	for(int i=strlen(a)-1,l=0;i>=0;i--,l++)
	{
		aa[l]=a[i]-'0';//转换并逆序
	}
	for(int i=strlen(b)-1,l=0;i>=0;i--,l++)
	{
		bb[l]=b[i]-'0';//转换并逆序
	}
	int p=max(strlen(a),strlen(b)),x=0;
	for(int i=0;i=0;i--)//删除补位零并输出答案
	{
		if(i==p&&ans[p]==0)m=1;
		if(m==1&&ans[i]!=0)m=0;
		if(m==0)
		{
			printf("%d",ans[i]);
			n=1;
		}
	}
	if(n==0)printf("0")
      return 0;
}
__________________________________

3) 高精度乘法:
​#include
using namespace std;
int main()
{
	char al[5005],bl[5005];
	int a[5005],b[5005],c[10005];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	scanf("%s%s",al,bl);
	int lena=strlen(al);
	int lenb=strlen(bl);
	for(int i=0;i1)
	{
		lenc--;
	}
	for(int i=lenc;i>=1;i--)
	{
		printf("%d",c[i]);
	}
	return 0;
}

​
__________________________________

4) 高精度除法:

A. 高精除低精:

​#include
using namespace std;
int main()
{
	char al[6000];
	int a[6000],b,c[6000];
	memset(a,0,sizeof(a));
	memset(c,0,sizeof(c));
	scanf("%s%d",al,&b);
	int lena=strlen(al);
	for(int i=0;i 

__________________________________

B. 高精除高精.***

​#include
using namespace std;
int a[5005],b[5005],c[5005];//定义
void init(int a[])
{
	char s[5005];
	scanf("%s",s);
	a[0]=strlen(s);
	for(int i=0;i0;i--)
	{
		printf("%d",a[i]);
	}
	printf("n");
}
int cmp(int a[],int b[])//判断大小
{
	if(a[0]>b[0])return 1;
	if(a[0]0;i--)
	{
		if(a[i]>b[i])return 1;
		if(a[i]0&&a[a[0]]==0)
		{
			a[0]--;
		}
		return;
	}
}
void numcpy(int p[],int q[],int det)
{
	for(int i=1;i<=p[0];i++)
	{
		q[i+det-1]=p[i];
	}
	q[0]=p[0]+det-1;
}
void chugao(int a[],int b[],int c[])
{
	int tmp[5005];
	c[0]=a[0]-b[0]+1;
	for(int i=c[0];i>0;i--)
	{
		memset(tmp,0,sizeof(tmp));
		numcpy(b,tmp,i);
		while(cmp(a,tmp)>=0)
		{
			c[i]++;
			jian(a,tmp);
		}
	}
	while(c[0]>0&&c[c[0]]==0)//删除补位零
	{
		c[0]--;
	}
}
int main()
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	init(a);
	init(b);
	chugao(a,b,c);
	print(c);
	return 0;
} 

​
__________________________________

5. 位运算:

1.作用:提高运算速度

2.符号:

'&' 与 两个位都为1时,结果才为1

'|' 或 两个位都为0时,结果才为0

'^' 异或 两个位相同为0,相异为1

'~' 取反 0变1,1变0

'<<' 左移 各二进位全部左移若干位,高位丢弃,低位补0

'>>' 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

注:负数以补码形式参与位运算 __________________________________

6. 贪心算法;

核心:每一步都最优化

__________________________________

7. 递推算法:

核心:找到递推方程

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/722477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号