AKSZ-枚举算法
2024-03-17 17:29:37
发布于:广东
枚举算法
进制
- 二进制:以开头的数字
int a = 0b111;
- 八进制:以开头的数字
int b = 0o7;
- 十六进制:以开头的数字
int c = 0x7;
十进制转二进制
具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。
十进制转八进制
除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数
乘8取整法,即将小数部分乘以8,然后取整数部分,剩下的小数部分继续乘以8,然后取整数部分,剩下的小数部分又乘以8,一直取到小数部分为零为止。如果永远不能为零,就同十进制数的四舍五入一样3舍4入。
枚举
三要素:枚举条件、枚举范围和判定条件
枚举算法简单粗暴,暴力枚举所有可能
计时运行时间
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
int main(){
clock_t start, end;
start = clock();
//下面是你的代码
//上面是你的代码
end = clock();
printf("%.21f ms", double(end - start) / CLOCKS_PER_SEC * 1000);
}
二进制枚举子集
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
int n;
int a[1145];
void solve(int x){
for(int i = 0; i < n; i++){
if((1 << i) & x){
cout << a[i] << " ";
}
}
puts("");
}
int main(){
cin >> n;
for(int i = 1; i <+ n; i++) cin >> a[i];
for(int i = 0; i <= (1 << n) - 1; i++){
solve(i);
}
}
埃氏筛法
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
int n;
int prime[1145];
void init(){
prime[1] = 1;
for(int i = 2; i <= n; i++){
if(!prime[i]){ //如果该数是素数
for(int j = 2 * i; j <= n; j += i){ //寻找该数的倍数 将该数的倍数标记为非素数
prime[j] = 1;
}
}
}
}
int main(){
int sum = 0;
cin >> n;
init(); //预处理函数
for(int i = 1; i <= n; i++){
if(!prime[i]) cout << i; //输出素数
}
return 0;
}
这里空空如也
有帮助,赞一个