zoukankan      html  css  js  c++  java
  • 快速求幂

    HDU 2035 人见人爱A^B(二分求幂,快速求幂):http://acm.hdu.edu.cn/showproblem.php?pid=2035 使用大数据思想在数组中求:

    两种垃圾做法:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main(){
    
    	int m,n;
    	while(~scanf("%d %d", &m, &n))
    	{
    		if(m==0&&n==0)
    			break;
    		int a[3],b[3],c[3]={0,0,0},i;
    		for(i=0;i<3;i++)
    		{
    			a[i]=b[i]=m%10;
    			m=m/10;
    		}
    		n--;
    		while(n--)
    		{
    			for(i=0;i<3;i++)
    				for(int j=0 ; j<3;j++)
    				{
    					if(j+i<3)
    					{
    						c[j+i]=a[i]*b[j]+c[j+i];
    						if(c[j+i]>9)
    						{
    							if(i+j+1<=2)
    								c[i+j+1]=c[j+i+1]+c[j+i]/10;
    							c[i+j]=c[j+i]%10;
    						}
    					}
    				}
    			b[0]=c[0],b[1]=c[1],b[2]=c[2];
    			c[0]=c[1]=c[2]=0;
    		}
    		printf("%d
    ",b[2]*100+b[1]*10+b[0]);
    
    	}
    	return 0;
    }


     

    #include<iostream>
    using namespace std;
    int main()
    {
    		int m,n;
    	while(scanf("%d %d", &m, &n)!=EOF)
    	{
    	
    		if(m==0&&n==0)
    			break;
    		
    		m=m%1000;
    		int w=m;
    		n--;
    		while(n--){
    		m=m*m%1000;
    		}
    		cout<<m<<endl;
    	}
    }



     

     相对来说下面的两种还是蛮不错的这应该算是快速幂中的一种吧

    二分求幂

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int main(){
    	int a,b;
    	int ans;
    	while(~scanf("%d%d",&a,&b)){
    		if(a==0&&b==0) break;
    		a=a%1000;//底数取余
    		ans=1;
    		while(b>0){ 
    			if(b%2==1)//1.奇数时,多出来的一项提前放到ans里  2.b==1时,完成结果和底数的最后一次相乘
    				ans=(ans*a)%1000;//结果取余
    			a=(a*a)%1000;//二分操作
    			b=b/2;//1.二分  2.b==1时,b/2=0,作为结束循环的条件
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }


     

    二分求幂(位运算)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int main(){
    	int a,b;
    	int ans;
    	while(~scanf("%d%d",&a,&b)){
    		if(a==0&&b==0) break;
    		a=a%1000;
    		ans=1;
    		while(b>0){
    			if(b&1)//判断是否为奇数,相当于 if(b%2==1)
    				ans=(ans*a)%1000;
    			a=(a*a)%1000;
    			b=b>>1;//二进制向右移一位,相当于 b=b/2;
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }


     

    当然快速幂不只是用在数中,在矩阵中还会用到快速幂的用法

    详见网址:http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2fu014665013%2farticle%2fdetails%2f40452065

  • 相关阅读:
    git push出现unpack failed: error Missing tree错误的解决方法
    Android N 分屏
    adb 查看最上层activity名字
    Ubuntu 切换JDK 版本
    Android的开机流程
    HTTP 协议中GET和POST到底有哪些区别(转)
    github爬虫100项目
    web攻击之xss(一)
    Kali-Dos洪水攻击之Hping3
    zipCrack-v1.1 工具介绍
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432060.html
Copyright © 2011-2022 走看看