首页 > 其他分享 >快速幂,位运算,pow()函数

快速幂,位运算,pow()函数

时间:2022-10-09 12:55:54浏览次数:44  
标签:std cout int pow 函数 printf include sum 运算

位运算:

位运算可以用来查找01二进制串中1或0的个数,同时也可以实现幂的计算,但是只能是以2为底的幂运算

统计字符串中1的个数

#include<bits/stdc++.h>
using namespace std;
string T;
int main()
{
	cin>>T;
	int count=0;
	cout<<T.length()<<endl; 
	for(int i=T.length()-1;i>=0;i--){
		if((T[i]-'0')&1) count++;
	}
	cout<<count<<endl;
	return 0;
}

求a的b次方对p取模(1<=a,b,p<=10^9)(快速幂)时间复杂度:o(log(b))

#include<bits/stdc++.h>
using namespace std;
int a,b,p;
int main(){
	cin>>a>>b>>p;
	long long sum=1;
	for(;b>0;b=b>>1){
		if(b&1) sum=(sum*a)%p;
		a=(a*a)%p;
		cout<<a<<" "<<b<<endl;
	}
	cout<<sum<<endl;
	return 0;
}

求a*b对p取模,1<=a,b,c<=10^18(快速幂)

#include<bits/stdc++.h>
using namespace std;
int a,b,p;
int main(){
	cin>>a>>b>>p;
	long long sum=0;
	for(;b>0;b=b>>1){
		if(b&1) sum=(sum+a)%p;
		a=(a*2)%p;
		cout<<a<<" "<<b<<endl;
	}
	cout<<sum<<endl;
	return 0;
}

 pow函数的时间复杂度为,快速幂时间复杂度为o(logn)。当我们遇到比较多次数使用pow函数时,可能为导致时间花销比较长,会T,这时候我们可以用位运算来代替pow函数,但是当数据量比较大时,位运算可能也会超时。这是我们可以用一个qw数组,qw[i]表示以某个数X为底,X^i;下面以二进制为例

#include<bits/stdc++.h>
using namespace std;
const int N=1000;
int a,b,p;
int qw[N]={1};
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		qw[i]=qw[i-1]<<1;
	}
	for(int i=0;i<=n;i++){
		cout<<"i: "<<i<<" "<<qw[i]<<endl;
	}
	return 0;
}

tips:有些时候题目输出数据量很大,这是可能会在输出卡时间,我们一般使用的cout花费时长比printf ()花费时长要长,且数据量越多越明显,我们可以有两种解决办法:

1.使用printf()代替cout。printf()用法:printf("<格式化字符串>", <参量表>)。

#include<bits/stdc++.h>
using namespace std;
const int N=1000;
int a,b,p;
int qw[N]={1};
int main(){
	printf("%d\n",26);
	printf("%d",26);
	puts("");
	printf("%4d",14);//4d表示输出宽度,14的宽度为2,所以就会在14左边补两个宽度的空格。 
	printf("%-4d",14);//输出宽度为4,如果比实际数值宽度大,多出的宽度会在右边用空格填补 
	puts("");
	printf("%.7f",2.102938432947223810832047204);//.7f表示小数点保留到7位. 
	return 0;
}

2.在代码中加上:ios::sync_with_stdio(false),这样cou和printf的速度是一样的,缺点就是加了这句话之后,你的代码块中只能使用cout或者printf,两者不能交替使用。

标签:std,cout,int,pow,函数,printf,include,sum,运算
From: https://www.cnblogs.com/penoy/p/16770389.html

相关文章

  • 网络字节序与主机字节序的转换函数(实践)
    什么是字节序?字节序,顾名思义,指字节在内存中存储的顺序。(1)小端字节序,数值低位存储在内存的低地址,高位存储在内存的高地址;(2)大端字节序,数值高位存储在内存的低......
  • 网络字节序与主机字节序的转换函数实践
     在Linux网络编程中,经常会遇见网络字节序喝主机字节序的相互转换,要了解他们,首先要知道什么是字节序。字节序,顾名思义,指字节在内存中存储的顺序。比如一个int32_t类型的......
  • 网络字节序与主机字节序的转换函数实践
    1.网络字节序与主机字节序在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。字节序,顾名思义,指字节在......
  • 布尔类型、比较运算符
    布尔类型True表示真(是、肯定)False表示假(否、否定)变量名称=布尔类型字面量比较运算符代码案例#定义变量存储布尔类型的数据bool_1=Truebool_2......
  • 一篇文章介绍 符号运算的妙用
    以后把看到的觉得有用的符号运算记录下来。符号运算效率会更高一点,虽然甚微,但是还是有的。我记录的都是实用的,要是用上自己都看不懂,就有点搬石头砸自己的脚了。 ## 判断......
  • 网络字节序与主机字节序的转换函数实践
    .什么是字节序字节序是处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。简单来说,就是指超过一个字节的数据类型在内存中的存储的顺序。那么很明显,像char......
  • 网络字节序与主机字节序的转换函数实践
    主机字节序 在不同的CPU处理器下,有不同的字节序类型,而字节序是指整数在内存中存储的顺序叫做主机序。最常见的主机序有两种:大端存储(Bigendian):最高有效位存于最低内存地......
  • 网络字节序与主机字节序的转换函数实践
    在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。字节序,顾名思义,指字节在内存中存储的顺序。比如一......
  • 运算符
    运算符(自增自减)Java语言支持的运算符算数运算符:+-*/%++--赋值运算符=关系运算符><<=>===!=instanceof逻辑运算符&&||!位运算符......
  • PHP 常用函数
    时间http://php.net/manual/zh/ref.datetime.phpdate_default_timezone_get()—取得一个脚本中所有日期时间函数所使用的默认时区date_default_timezone_set()—设定用......