小知识(二分幂)

  把以前大神们讲过的一些小知识点整理了一下。 

 1.二分幂的原理:

代码:

 1 int power(int a,int b)
 2 {
 3     int ans=1;
 4     while(b!=0)
 5     {
 6         if(b%2==1)
 7             ans*=a;
 8         b/=2;
 9         a*=a;
10     }
11     return ans;
12 }
 1 double power(double b,unsigned int e)
 2 {
 3     if(e==0)
 4         return 1;
 5     if(e==1)
 6         return b;
 7     double result=power(b,e/2);
 8     result*=result;
 9     if(e%2)//a&0x1=a%2;
10         result*=b;
11     return result;
12 }

由二分幂来求出a的b次方的最后一位数:HDU1079

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 #include<vector>
 7 using namespace std;
 8 long long power(long long a,long long b)
 9 {
10     long long  ans=1;
11     long long temp=a;
12     while(b!=0)
13     {
14         if(b%2==1)
15             ans=(ans*temp)%10;
16         b/=2;
17         temp=(temp%10)*(temp%10)%10;;
18     }
19     return ans;
20 }
21 int main()
22 {
23     long long  a,b;
24     long long s;
25     while(cin>>a>>b)
26     {
27         s=power(a,b);
28         cout<<s<<endl;
29     }
30     return 0;
31 }
View Code

2.素数筛选法:

图片更直观:删去2,3,5,7....的倍数,直到数组中所有的数都是素数。

代码:

 1 const int maxn=1000005;
 2 bool is[maxn];
 3 int prime[maxn];
 4 int main()
 5 {
 6     int i,j;
 7     memset(is,false,sizeof(is));    
 8     is[1]=true;
 9     int cnt = 0;
10     for(i=2;i*i<maxn;i++)
11     {
12         if(!is[i])
13         {
14             for(j=i*i;j<maxn;j+=i)//i的倍数
15                 is[j]=true;
16         }
17     }
18     for(i=2;i<maxn;i++)
19     {
20         if(!is[i])
21             prime[cnt++]=i;//cnt素数的个数
22     }

 3.求最大公约数(gcd):

 

1 int gcd(int a,int b)
2 {
3 if(b==0)  return a;
4 else return gcd(b,a%b);
5 }

最小公倍数:lcm(a,b)=a*b/(gcd(a,b));

 4.快速幂: 用于求解a的b次方,b的值很大。

求x^n次方,n=2^k1+2^k2+2^k3+..., x^n=x^2^k1*x^2^k2*x^2^k3*..., 如x^20=x^16*x^4;

 

 1 typedef long long LL;
 2 LL fun(LL x,LL n,)
 3 {
 4     LL res=1;
 5     while(n>0)
 6     {
 7         if(n & 1)
 8             res=(res*x)%mod;
 9         x=(x*x)%mod;
10         n >>= 1;//右移位
11     }
12     return res;
13 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

转载于:https://www.cnblogs.com/yinqx/p/5004996.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值