C++优化技巧1

在这里提供几种基础的增加代码运行效率的几种方案

快速读取数字

快速读取数字,时间是scanf的1/20

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
//inline
inline int read(){
    int x=0,f=1;
    char ch = getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-'){
            //遇见负号就改变正负号
            f=-f;
        }
        ch = getchar();
    }
    while(ch>='0'&&ch<='9'){
        //x<<1相当于x*2,x<<3相当于x*8,48对于的ascii是‘0’,11 0000,是而与它相异或的0-9之间的相当于直接减去‘0’
        //表达式相当于x=x*10+ch-‘0’,但是位运算效率更高更快
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int main(){
    int s=read();
    cout<<s;
    return 0;
}

功能快捷键

fill:
 按照单元赋值,将一个区间的元素都赋同一个值
 在头文件algorithm里面
 如:一个长度为n的数组dis
 fill(dis,dis+n,initValue);

memset:(只能0 和 -1)
 按照字节填充某字符
 在头文件cstring里面
 memset(graph,0,sizeof(graph))

高精度相加

const int S = 1000000000;//需要实现高精度,每个数表示 10 ^ 9 位
const int NumSize = 4;//可以根据int的具体长度而增加

struct Num
{
int integer[NumSize];
}a[1001];
void add(Num &x, Num &y)
{
for (int i = 0; i < NumSize; i++)
{
x.integer[i] += y.integer[i];
}

for (int i = 1; i < NumSize; i++)//保证前一个还加上了后一个的进位
{
x.integer[i] += x.integer[i - 1] / S;
}

for (int i = 0; i < NumSize; i++)//保证每一个都没超过10的9次方
{
x.integer[i] %= S;
}

return;
}

位运算快速取模:

 对于2的幂次方取整数如2,4,8,16
 x & (mod -1),比% 快了10倍
 但是一般的数字不可以

快速幂

把b转换成二进制数。
该二进制数第i位的权为2i-1
例如
  a11 = a1+2+8
  11的二进制是1011
因此,我们将a¹¹转化为
在这里插入图片描述
会比一个一个乘快很多

	#include<bits/stdc++.h>
	using namespace std;
	long long quickpower(long long x,long long y)
	{
	    long long ans=1,cnt=x;
	    while(y)
	    {
	        if(y&1)
	        {
	            ans*=cnt;
	        }
	        cnt*=cnt;
	        y>>=1;
	    }
	    return ans;
	}
	int main()
	{
	    long long x,y,ans;
	    cin>>x>>y;
	    ans=quickpower(x,y);
	    cout<<ans;
	    return 0;
	}

x的n次方求模:

主要使用两点求模性质,一个是
(a^ b)mod m = ((a mod m)^b)mod m
和 ab mod m = ((a mod m)(b mod m))mod m
但是由于求幂的时候乘1过慢,所以我们就需要利用快速幂,得到的结果不变
比如说x^2n mod m= ((x^n mod m)* (x^n mod m)) mod m

int n,m;
    int result =1;
    int po = n;
    while(po){
        if(po&1){
            result = result%m * x%m;
        }
        x=(x*x)% m;
        po>>=1;
    }
    return result%n;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值